C#で他のアプリを操作(ハンドル取得編)

Windowsアプリケーションを動かす場合に最初に必要なのがハンドルです。
ハンドルとは、個々のウインドウやボタンなどの部品に割り付けられる固有のIDでいわゆる住所のようなものです。

本ブログでは、C#からWindowsAPIのFindWindowメソッドをコールしハンドルを取得する方法を紹介します。

Windows APIウィンドウズ エーピーアイ)とは、Microsoft WindowsシステムコールAPIのこと。特に32ビットプロセッサで動作するWindows 95以降やWindows NTで利用できるものはWin32 APIと呼ばれる。また、それらのWindowsにおけるWin32 APIの実装をWin32と呼ぶ。

https://ja.wikipedia.org/wiki/Windows_API#Win64

ハンドルを見つけるのに必要な要素

ハンドルを見つけるのに必要な要素はウインドウのタイトルクラス名となります。ハンドル取得先のタイトルがない場合(テキストボックスなど)はクラス名を指定して取得します。場合によっては取得精度を向上させる為、タイトル、クラス名の両方を指定する場合もあります。

Spy++を使ってハンドル、タイトル、クラス名を確認

VisualStudioに同梱のSpy++というツールを使用し確認を行います。
Spy++がインストールされてないって方は、こちらを参考にセットアップしてください。

1.C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\spyxx.exeを開きます。

kitter

インストールしているVisualStudioのバージョンによっては

パスの黄色いマーカー部分が異なる場合があります。

2.検索→ウインドウ検索の順でクリックすると下記ウインドウが表示されます。

3.ウインドウ検索ウインドウ内のファインダーツールのアイコンをドラッグしハンドルを調べたいウインドウへドロップします。

下記はメモ帳を立ち上げてハンドルをした場合のスクリーンショットになります。
ハンドルが「00070584」、
キャプション(ウインドウタイトル)が「無題 – メモ帳」、
クラスが「Notepad」であることがわかりました。

kitter

Spy++起動後にハンドルを知りたいアプリケーションを起動した場合、F5キーを押して表示内容を更新させる必要があります。

C#でハンドル取得

本項では前項のSpy++で取得したウインドウタイトル及びクラス名を使用してC#からハンドルを取得します。

WinAPI.cs

使用例
キャプション(ウインドウタイトル):無題 – メモ帳
クラス:Notepad

kitter

ウインドウタイトルで検索する場合は、全角、半角、スペースの箇所も考慮して指定しないと正しくハンドルが取得できません。
また、ウインドウタイトル及びクラス名のどちらかを指定する場合は不要な引数をnullにします。

次回は取得したハンドルを元にメモ帳に文字入力を行ってみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です