次のように、ウィンドウ階層を指定して特定のウィンドウを見つける関数を作成しています。
protected bool MapWindowHierarchy (ATS.Library.Window window)
{
bool result = false;
List<Process> processes = null;
processes = GetProcesses().ToList();
processes.ForEach
(
process =>
{
if (process.MainWindowHandle == window.Handle)
{
// Populate window properties.
// Get child windows with filled properties.
}
}
);
return (result);
}
protected bool MapWindowHierarchy (List<ATS.Library.Window> windows)
{
return (windows.All(window => this.MapWindowHierarchy(window)));
}
public sealed class Window
{
public IntPtr Handle { get; set; }
public string Class { get; set; }
public Rectangle Bounds { get; set; }
public Win32Api.User32.ShowWindowCommands WindowState { get; set; }
public string Caption { get; set; }
public int Style { get; set; }
public List<ATS.Library.Window> Windows { get; set; }
public void PopulateFromHandle(IntPtr hWnd)
{
// Populate above properties using Win32 API.
}
}
これは大まかなコードですが、目的は、[Window]
クラスを使用して階層を作成し、実際の階層を使用して[EnumChildWindows]
一致するかどうかを確認することです。これは明らかにうまくいきますが、私はこの SO の質問, Hans Passant's commentに出くわしました"Every unique window in a desktop session must have a unique Windows class name"
.それを解釈する方法がわかりませんでした (同じクラス名の複数のウィンドウについては下の画像を参照してください)。おそらく、彼が言及していることはマネージ コード (WinForms、WPF など) にのみ適用されます。
さらに、Spy++ のようにハンドル (hWnd) を持っている場合、ウィンドウのクラス名とテキストを取得する方法がわかりません (下の画像を参照)。[Find Window]
ダイアログではなく、ツリー ビューでテキストがどのように取得されるかに注目してください。
質問:
- ネイティブ アプリのみをターゲットにしているので、Han のコメントについて心配する必要がありますか?
- ウィンドウのハンドルを指定してクラス名を取得する方法は?
- ウィンドウのハンドルを指定してウィンドウテキストを取得する方法(画像のように)?