2

实例 A 正在尝试恢复实例 B 的窗口,但我无法获得 B 的窗口句柄。我认为问题在于 B 正在使用以下方法将窗口最小化到系统托盘:

this.Visibility = Visibility.Hidden;

A 正在尝试使用以下方法获取 B 的窗口句柄:

Process process = Process.GetCurrentProcess();
Process.GetProcessesByName(process.ProcessName).First().MainWindowHandle;

这等于IntPtr.Zero

我还尝试使用 Spy++ 按类名获取窗口句柄,但类名具有以下格式的每个实例 GUID:

HwndWrapper[FileName.exe;;ad445199-cf93-48a4-bd24-2f97d54c8af8]
4

1 回答 1

3

那是因为你想要的基本上不存在,而且这个概念MainWindowHandle是一个严重的误称,它潜入了.Net Framework,造成了永远的混乱。From可以有多个(或零个):将进程转换为窗口

“我有线程ID,如何获取对应的窗口?”

您可以使用 EnumThreadWindows 函数来获取线程上的所有窗口。

“是的,我知道 EnumThreadWindows,但是如何获得我想要的窗口呢?”

好吧,你还没有说你想要什么。

“我想要线程对应的窗口。”

但是哪一个?您将如何在所有窗口中做出决定?

“这就是我要问你的!”

但是你还没有描述你想要什么。

“我想要线程对应的窗口,你为什么不回答我的问题?”

请注意,说“我正在寻找顶级无主窗口”是向前迈出的一步,但它仍然不能唯一标识一个窗口。一个进程中可以有多个顶级无主窗口。例如,资源管理器通常有很多顶级无主窗口。有桌面、任务栏、打开的文件夹窗口和属性表。如果你问资源管理器的“那个”顶级无主窗口,你想要哪一个?

也许人们认为有一种方法可以唯一地指定进程的“该”窗口,因为 System.Diagnostics.Process 对象有一个名为 MainWindowHandle 的属性。该属性的文档也没有做任何事情来消除这个概念。我不知道该属性如何在多个顶级无主窗口中做出决定。

MSDN Q&A Get the Main Window中也详细阐述了该主题:

Q如何找到进程的主窗口?我正在编写一个类似间谍的工具,我需要获取一个进程的主窗口(HWND),以便我可以向它发送一条消息,如 WM_ACTIVATEAPP。

A你指的是哪个主窗口?

于 2010-09-15T20:23:48.643 回答