Mat*_*lia 18
如果你在谈论得到一个进程句柄,那么它是不是HWND(这是一个W¯¯我ND流^ h andle),但HANDLE(即内核对象句柄); 要检索相对于当前进程的伪句柄,您可以GetCurrentProcess像其他人一样使用解释.
另一方面,如果你想获得一个HWND(一个窗口句柄)到你的应用程序的主窗口,那么你必须走现有窗口EnumWindows并检查它们的所有权GetWindowThreadProcessId,将返回的进程ID与返回的进程ID进行比较GetCurrentProcessId.尽管如此,在这种情况下,您最好在创建变量时将主窗口句柄保存在变量中,而不是完成所有这些混乱.
无论如何,请记住,并非所有句柄都是相同的:特别是HANDLEs和HWNDs是完全不同的野兽:第一个是内核句柄(=内核管理对象的句柄),并使用通用内核句柄操作进行操作函数(DuplicateHandle,, CloseHandle...),而第二个是相对于窗口管理器的句柄,窗口管理器是操作系统的一个完全不同的部分,并使用一组不同的函数进行操作.
实际上,理论上a HWND可能具有相同的"数值"值HANDLE,但它们指的是完全不同的对象.
MSa*_*ers 14
您(错误地)假设某个进程只有一个HWND.这通常不正确,因此Windows无法提供API来获取它.一个程序可以创建两个窗口,结果有两个HWND.OTOH,如果您的程序只创建一个窗口,它可以将HWND存储在全局变量中.
GetConsoleWindow();
Run Code Online (Sandbox Code Playgroud)
"返回值是与调用进程关联的控制台使用的窗口的句柄,如果没有这样的关联控制台,则返回NULL."
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683175(v=vs.85).aspx
GetActiveWindow()可能不是答案,但它可能有用
"返回值是附加到调用线程的消息队列的活动窗口的句柄.否则,返回值为NULL." > msdn GetActiveWindow()文档
然而,窗口不只是弹出 - 所以你应该从你/你的应用程序创建窗口的地方检索句柄...例如CreateWindow()返回HWND句柄所以你需要的只是保存和检索它...
该GetCurrentProcess()函数返回一个伪句柄,该句柄引用当前进程.此句柄可用于采用进程句柄参数的大多数Win32 API函数.
该文档包含有关此伪句柄的更多信息,包括如何在需要时将其转换为真正的句柄.