Category Archives: Windows

Windowsデスクトップアプリの座標関係覚書

.NETアプリ

Location

トップレベルのFormのLocationはスクリーン座標でフォームの左上の座標を表す。

ControlのLocationはコンテナからの相対座標の左上を表す。コントロールのスクリーン座標を知りたいときは、コンテナのPointToScreenにコントロールの相対座標を渡す。

最大化しているとき

フォームが最大化あるいは最小化しているときは、最大化する前のフォームの座標をRestoreBoundsから取得できる。

座標の保存

最大化しているときはRestoreBoundsを保存する。

座標の復元

このコードでは保存された座標がスクリーン上にあるかどうかは確認していない。

Win32アプリ

最大化しているとき

ウインドウが最小化されていてリストアしたとき最大化するかどうかはGetWindowPlacement()で調べることができる。WPF_RESTORETOMAXIMIZEDが立っていれば、リストアしたとき最大化する。

.NETではフォームが最小化されていて、リストアしたとき最大化するのかどうかを調べる方法はないと思われるので、Resizeイベントでその状態かどうかのフラグを用意する。

マルチスクリーン

マルチスクリーンのスクリーン座標はモニタをつなげて1つのスクリーンとみなせるような座標になる。

あるスクリーン座標がモニタ内にあるかは以下のように調べられる。(コードはC++/CLI)

simple menu

簡単なWin32メニューのポップアップ

オーナードローを有効にしてメッセージを処理する

ソースコード

回復パーティションが2つある

Windowsをアップグレードすると回復パーティションが新たにつくられることがあるそうだ。古い回復パーティションはもう必要ないため削除してもいいらしい

注意:以下の作業はシステムが壊れる可能性があるので自己責任でお願いします。

今使ってる回復パーティションを見つける

管理者権限でコマンドプロンプトを起動しreagentc /infoを実行。

ここから今使ってる回復パーティションはharddisk0\partition3であることがわかる。

回復パーティションを削除する

削除にはDISKPARTを使う。管理者権限でコマンドプロンプトを起動して以下のように行う。

今使っている回復パーティションは3だったのでいらないはずの4を削除した。ディスクの管理でみると以下のようになっている。

あとはこの空いた領域をCドライブと合体させたいので、AOMEI Partition Assistantを使って以下のように行った。

ここで確認を押してツールバーの「適用」を押すと処理が始まる。

完了後の「ディスクの管理」の状態

タスクバー

下固定。いつもは上に配置して使っているので慣れるまで大変。

クイックローンチがない

クイックローンチ(C:\Users\User\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch)にショートカットをたくさんおいて使っていたのでこれがなくなると大変になる。

常にグルーピング?

グルーピングしたくない

IE

IEがないが、IEのコントロールはあるようなのでIEをつかった既存のアプリは動く。バージョンは以下。新しくなっているかは不明。ちなみにIEを起動するとEdgeが起動する。

デスクトップの右クリック

デスクトップの右クリックメニューが変わった。

いままでのメニューは「Show more options」で表示できる。

結論

とくに嬉しいことはなかった。というか使いづらい。さらにモバイルに近づけようとしているようだ。バージョンが上がるごとにWindowsがつかいずらくなっている。

グループポリシーエラー このコンピュータのグループポリシーオブジェクトを開くことができませんでした。

gpedit.mscを開くと以下のようなエラーが出る。

グループポリシー エラー

グループポリシーの設定ファイルが壊れているとこのエラーがでるようだ。

設定ファイルの初期化

フォルダ C:\Windows\System32\GroupPolicy\Machine をリネームすると次回起動時にまた作られる。C:\Windows\System32\GroupPolicyは隠しファイルになっているので、エクスプローラーで隠し属性ファイルも表示するようにする。

エクスプローラーで隠し属性ファイル表示

C:\Windows\System32\GroupPolicy\Machineをリネーム

Windowsのコマンド引数でのダブルクオート

コマンドプロンプトでコマンド(アプリ)を引数付きで起動したとき、引数のダブルクオートがどう解釈されるかの実験

通常(ダブルクオートなし)

スペースなしの文字列をダブルクオート

ダブルクオートで囲ってもプログラム内では現れない。(mainのargvの話)

スペースありの文字列をダブルクオート

ダブルクオートで囲むと1つの引数として扱われる

スペースなしの文字列をシングルクオート

シングルクォートはダブルクオートとは違い引数に現れる。Windowsではシングルクォートは特別な文字列ではないようだ。

スペースありの文字列をシングルクオート

シングルクォートは特別な文字でないことがわかる。

ではプログラム内でダブルクオート文字列、例えば“abc”を受け取りたい場合はどうしたらいいだろうか。結論から言うと3つのダブルクオートでabcを囲めばいい。

3つのダブルクオートは以下のように解釈される。

  1. 開始ダブルクオート
  2. 終了ダブルクオート
  3. 終了ダブルクオート直後のダブルクオートは通常文字として扱われるダブルクオート

あるいは2つのダブルクオートで1つのダブルクオートと解釈される。
この形式はCランタイムとWin32APIのCommandLineToArgvWで扱い方が違うようなので、以下の場合には使えない。

プログラム内でabc=”xyz = 123″を受け取りたい場合。

\でエスケープできる。

引数を表示するアプリ

引数を解釈して表示してくれるアプリ、開発のときの確認用。あるいは長い引数をとるアプリのときプログラム内部でどう受け取られるかの確認用。CRTとCommandLineToArgvWと独自実装で表示する。

https://github.com/ambiesoft/argCheck/releases

グループポリシーエディターが起動しなくなったのを直す

現象

直し方

エクスプローラーで、C:\Windows\System32\GroupPolicyを開く。このフォルダは隠しフォルダになっているので、「表示」メニューから隠しファイルを表示するオプションを有効にするか、アドレスバーに直接入力する。

このフォルダの中にある、MachineMachine.oldにリネームする。

Windows10で共有フォルダにゲストアクセスする

共有元(Windows10)の設定

WindowsXPからもアクセスする

Windowsの機能のインストールで、SMB1.0を有効にする。
[WIN]+Rで実行ダイアログを表示し、appwiz.cplと入力し、Windowsの機能からSMB1.0をインストール。

ゲストアカウントを有効にしてリモート接続を許可する

[WIN]+Rで実行ダイアログを表示し、secpol.mscと入力し、Local Policies => User Rights Assignment => Deny access to this computer from the networkからGuestを削除する。

続いて、Local Policies => Security Options => Accounts: Guest account statusでゲストアカウントを有効にする。