📌

#68 【C#】他ウィンドウを操作する(事前準備)

2024/10/18に公開

概要

C# .NET Framework で他ウィンドウの操作を試してみようと思います。
題材として、Windows11 で追加されたエクスプローラーのタブ機能に干渉し、C#からエクスプローラーのタブを開いてみます。
今回はその事前準備として、実装に必要な情報の調査を行います。

調査

C# で特定ウィンドウを操作する際に必要な処理は大きく以下の2つです。
①ウィンドウを取得する
②ウィンドウにメッセージを送信する

これらの実行のために、ウィンドウ、メッセージの情報を調査する必要があります。

Spy++ を起動する

VisualStudioのインストールフォルダ配下に、spyxx.exespyxx_amd64.exeがあります。32bitのPCでは前者を、64bitのPCでは後者を起動してください。
自分の場合はここでした。
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\

見つからない場合

コンポーネントのインストールが必要です。
VisualStudio のメニューバー -> ツール -> ツールと機能を取得... を選択
image.png

[個別のコンポーネント]タブで以下を選択してインストール

  • [デバッグとテスト] > [C++ のプロファイル ツール]
  • [開発作業] > [C++ コア機能]
    image.png

ウィンドウの情報を確認する

Spy++ を起動するとこのような画面になるので、上部メニューから双眼鏡マークのウィンドウ検索ボタンを選択
image.png

画像のようにウィンドウ検索というポップアップが出るので、ファインダーツールのところにある照準マークみたいなのを、調査したい対象のウィンドウ(今回はエクスプローラー)までドラッグ
image.png

すると、ポップアップ内のハンドルやクラス名の部分が自動入力されるので、ハンドルの欄を削除してOK選択

検索に成功すると、Spy++のウィンドウツリーで、ヒットしたウィンドウにフォーカスが当たった状態となります。
image.png

ウィンドウは階層構造のため、この時点ではまだ目的のウィンドウの 子 または 親ウィンドウを選択してしまっている可能性があります。
今回使用するのはエクスプローラー全体のウィンドウです。ウィンドウツリー右クリック→[強調表示]を使用してお目当てのウィンドウを探し、[プロパティ...]を選択するとウィンドウの情報が見られます。
image.png

このクラス名が実装の際に必要となります。
ここまでで、①ウィンドウを取得する のための調査は完了です。

メッセージの情報を確認する

ウィンドウ情報の取得のときと同様に、Spy++のウィンドウツリーで目的のウィンドウを右クリックし、今度は[メッセージ]を選択します。すると、このような画面が表示されます。
image.png

この状態で、エクスプローラーを操作してみると、エクスプローラーが受信してるメッセージが大量に表示されます
image.png

では、エクスプローラーで新規タブを開いたときにどんなメッセージが発生しているか確認してみます
エクスプローラーでCtrl + T でタブを追加したところ、このようなメッセージが飛んでいるのが確認できました。(関係ないログが多いのでSpy++のログオプションでフィルタかけてます)
image.png

ウィンドウのときと同じように、右クリック→[プロパティ...]で内容を確認できます。
image.png

この、メッセージ番号(0111)と、wParam, lParam が②ウィンドウにメッセージを送信する のために必要な情報です。
以上で、②の調査も完了です。

次回について

次は、実際にC#からエクスプローラーのウィンドウにメッセージを送信し、タブを追加してみたいと思います。

Discussion