アプリケーションのウィンドウハンドルを取得する
質問
別のアプリmainWindowhandleを指定して、ウィンドウの状態に関する情報を収集するアプリを作成しています。子ウィンドウに関する情報を収集するのに問題はありませんが、アプリケーションの他の開いているウィンドウやメニューにアクセスすることはできません。アプリケーションのすべてのウィンドウハンドルを取得する方法はありますか?
解決
Process.MainWindowHandle
の動作を実行できます。P/ Invokeを使用して EnumWindows
関数。システムのすべてのトップレベルウィンドウに対してコールバックメソッドを呼び出します。
コールバックで、 GetWindowThreadProcessId
を呼び出し、ウィンドウのプロセスIDと Process.Id
を比較します。プロセスIDが一致する場合は、ウィンドウハンドルをリストに追加します。
他のヒント
最初に、アプリケーションのメインウィンドウのウィンドウハンドルを取得する必要があります。
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
IntPtr hWnd = (IntPtr)FindWindow(windowName, null);
その後、このハンドルを使用してすべての子ウィンドウを取得できます:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
private List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
}
所属していません StackOverflow