获取当前进程的HWND

我有一个使用窗口API的c ++过程。 我想获得自己的进程的HWND。 请引导我如何才能使它成为可能。

Solutions Collecting From Web of "获取当前进程的HWND"

你(错误地)假定一个进程只有一个HWND。 这通常不正确,因此Windows无法提供API来获取它。 一个程序可以创建两个窗口,结果有两个HWND。 OTOH,如果你的程序只创建一个窗口,它可以将该HWND存储在一个全局变量中。

如果你正在谈论获得一个进程句柄,那么它不是一个HWND(这是一个窗口句柄),而是一个句柄; 要检索相对于当前进程的伪句柄,可以使用GetCurrentProcess ()作为其他解释。

另一方面,如果你想获得一个HWND( 窗口句柄)到你的应用程序的主窗口,那么你必须用EnumWindows来遍历现有的窗口,并用GetWindowThreadProcessId ()来检查它们的所有权,比较返回的进程ID与由GetCurrentProcessId ()返回的一个。 不过,在这种情况下,最好在创建主窗口句柄时将其保存为var,而不是完成所有这些混乱。

不管怎样,请记住并不是所有的句柄都是相同的:HANDLE和HWND,特别是完全不同的野兽:第一个是内核句柄,用通用的内核句柄操作函数(DuplicateHandle,CloseHandle,…) ),而第二个是相对于窗口管理器的句柄,这是一个完全不同的操作系统的一部分,并用一组不同的函数进行操作。

实际上,HWND在理论上可能与HANDLE具有相同的“数字”值,但是它们会引用完全不同的对象。

GetCurrentProcess()函数返回一个引用当前进程的伪句柄。 这个句柄可以用在大多数带有进程句柄参数的Win32 API函数中。

该文档包含有关此伪句柄的更多信息,包括如何将其转换为真句柄(如果需要的话)。

你可以使用HANDLE WINAPI GetCurrentProcess(void); 从coreel32.dll。

请参阅MSDN条目。

获取您的控制台窗口

 GetConsoleWindow(); 

“返回值是与调用进程关联的控制台所使用的窗口句柄,如果没有这样的关联控制台,则返回NULL。”

https://msdn.microsoft.com/en-us/library/windows/desktop/ms683175(v=vs.85).aspx

获取其他窗口

GetActiveWindow()可能不是答案,但它可能是有用的
“返回值是附加到调用线程的消息队列的活动窗口的句柄,否则返回值为NULL。 > msdn GetActiveWindow()文档

然而,窗口不只是弹出 – 所以你应该从你/你的应用程序创建窗口的位置检索句柄…例如CreateWindow()返回HWND句柄,所以你所需要的是保存和检索它…

我的例子是不处理进程,但也许你需要这个:

 HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX); 

这将返回由其IDCL_COMBOBOX指定的控件的HWND。