获取当前进程的HWND

时间:2010-04-12 07:09:31

标签: c++ c winapi windows

我在c ++中有一个使用窗口API的过程。我想获得自己进程的HWND。请指导我如何才能实现。

7 个答案:

答案 0 :(得分:17)

如果您正在谈论获取进程句柄,那么它不是HWND w i nd ow h andle),但是HANDLE(即内核对象句柄);要检索相对于当前进程的伪句柄,可以使用其他人解释的GetCurrentProcess

另一方面,如果要获取应用程序主窗口的HWND窗口句柄),则必须使用{{}来遍历现有窗口3}}并使用EnumWindows检查其所有权,将返回的进程ID与GetWindowThreadProcessId返回的进程ID进行比较。尽管如此,在这种情况下,最好在创建变量时将主窗口句柄保存在变量中,而不是执行所有这些操作。

无论如何,请记住,并非所有句柄都是相同的:HANDLEHWND s,特别是完全不同的野兽:第一个是内核句柄(=内核句柄)管理对象)并使用通用内核处理操作函数(DuplicateHandleCloseHandle,...)进行操作,而第二个是相对于窗口管理器的句柄,这是一个完全不同的部分操作系统,并使用一组不同的功能进行操作。

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

答案 1 :(得分:14)

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

答案 2 :(得分:6)

获取控制台窗口

GetConsoleWindow();


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

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

获取其他窗口

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

然而,窗口不只是弹出 - 所以你应该从你/你的应用创建窗口的地方检索句柄...... ,例如CreateWindow()会返回HWND句柄,因此您只需要保存并检索它......

答案 3 :(得分:5)

GetCurrentProcess()函数返回一个伪句柄,该句柄引用当前进程。此句柄可用于大多数带有进程句柄参数的Win32 API函数。

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

答案 4 :(得分:2)

您可以使用Kernel32.dll中的HANDLE WINAPI GetCurrentProcess(void);

请参阅MSDN条目here

答案 5 :(得分:0)

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

HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX);

返回由IDCL_COMBOBOX指定的控件的HWND。

答案 6 :(得分:-1)

这是另一个答案:

this-> GetSafeHwnd();