如何在win32中获得HWND?

时间:2010-12-01 01:21:29

标签: c++ winapi

有没有办法获得窗口的HWND处理程序?
我正在使用win32。

3 个答案:

答案 0 :(得分:7)

您可以调用GetActiveWindow来获取应用程序中的活动控件,然后在返回的句柄上重复调用GetParent,直到它返回NULL。您获得的最后一个有效句柄应该是主窗口的句柄。

其他人说的更简单的方法是将CreateWindow的返回值存储在某个地方。

答案 1 :(得分:6)

您是不是通过CreateWindow()CreateWindowEx()创建了自己的窗口? CreateWindowEx() functionCreateWindow()函数都返回新创建的窗口的HWND

此外,操作系统会向您传递窗口HWND via your window procedure。这不是你打电话的功能;它是操作系统调用的函数,让您的应用程序执行任何所需的处理。

答案 2 :(得分:6)

理解为什么没有简单的方法可能会很好。这一切归结为“哪个窗口?”。您现在可能会在屏幕上看到多个窗口。例如,屏幕底部的任务栏是一个窗口。即使你自己的应用程序通常有多个。例如,“文件保存”对话框是一个窗口。即使是简单的MessageBox也是一个窗口。

那么,您如何识别您正在谈论的窗口?常见的答案是,您可以通过HWND来识别它们。因此,要获取“文件保存”对话框窗口的位置,请求与该HWND关联的位置。显然,你可以通过这种方式获得任何属性,除了 HWND本身!询问HWND(0x5e21)的X / Y位置是有意义的,但询问哪个HWND属于HWND(0x5e21)是愚蠢的。

现在,您可能会遇到另一个或多或少的唯一属性,并希望从中获取HWND。例如,您可能有X / Y位置。在这种情况下,WindowFromPoint(xy)将返回该位置的HWND

但最常见的情况是您需要对窗口的Windows消息作出反应。在这种情况下,您会将HWND窗口作为WindowProc()的第一个参数。

因此,除非您告诉我们您拥有哪些独特信息,否则我们无法告诉您如何找到匹配的HWND