WNDPROC窗口回调过程中接收到的句柄与CreateWindow返回的句柄之间的差异
The difference between the handle received in the WNDPROC window callback procedure vs the one returned by CreateWindow?
所以我想知道使用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
,因此还没有分配全局变量。
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 更正GLSL无绑定纹理句柄中的结构布局
- WNDPROC窗口回调过程中接收到的句柄与CreateWindow返回的句柄之间的差异