我在c ++中有一个使用窗口API的过程。我想获得自己进程的HWND。请指导我如何才能实现。
答案 0 :(得分:17)
如果您正在谈论获取进程句柄,那么它不是HWND
( w i nd ow h andle),但是HANDLE
(即内核对象句柄);要检索相对于当前进程的伪句柄,可以使用其他人解释的GetCurrentProcess
。
另一方面,如果要获取应用程序主窗口的HWND
(窗口句柄),则必须使用{{}来遍历现有窗口3}}并使用EnumWindows
检查其所有权,将返回的进程ID与GetWindowThreadProcessId
返回的进程ID进行比较。尽管如此,在这种情况下,最好在创建变量时将主窗口句柄保存在变量中,而不是执行所有这些操作。
无论如何,请记住,并非所有句柄都是相同的:HANDLE
和HWND
s,特别是完全不同的野兽:第一个是内核句柄(=内核句柄)管理对象)并使用通用内核处理操作函数(DuplicateHandle
,CloseHandle
,...)进行操作,而第二个是相对于窗口管理器的句柄,这是一个完全不同的部分操作系统,并使用一组不同的功能进行操作。
实际上,理论上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();