WNDPROC窗口回调过程中接收到的句柄与CreateWindow返回的句柄之间的差异

The difference between the handle received in the WNDPROC window callback procedure vs the one returned by CreateWindow?

本文关键字:句柄 CreateWindow 返回 之间 WNDPROC 过程中 回调 窗口      更新时间:2023-10-16

所以我想知道使用CreateWindow/CreateWindowEx创建窗口时返回的句柄与作为参数传递给相关窗口的WNDPROC窗口回调过程的句柄之间是否有任何差异。这个问题的上下文是,我需要使用需要窗口句柄的某些API函数,所以我认为,而不是传递窗口回调过程收到的句柄,我可以只保存一次由CreateWindow返回的句柄的副本,然后将其用于后续操作,以防两个句柄相同。

问候,

Devjeet

这里要小心,窗口过程被一个窗口的多个实例使用。回调由WNDCLASSEX的值决定。所以任何CreateWindow/Ex()调用使用相同的窗口类名使用相同的回调。如果你这样做是为了将回调映射到一个类实例方法,那么你首先必须考虑将回调的hwnd参数映射到一个类实例。为WM_CREATE创建一个特例

是的,它们是相同的,这就是拥有HWND的全部意义。每个窗口只有一个HWND,它在系统中标识它,并且在DestroyWindow被调用之前保持有效。它由CreateWindow(EX)返回并与每条消息一起发送,因此您可以使用它作为窗口的唯一标识符,即使您创建了几个相同类的窗口。

但是请注意,有些消息甚至在CreateFunction返回之前就被发送到窗口过程,所以如果您使用全局变量来保存HWND:

HWND globalHwnd = NULL;
int main()
{
    //...
    globalHwnd = CreateWindow(...);
}
LRESULT WndProc(HWND hWnd, ...)
{
    assert(hWnd == globalHwnd); //fail!
}

断言将失败,因为在CreateWindow返回之前已经发送了几个消息,例如WM_CREATE,因此还没有分配全局变量。