Win32 API - 将 LO/HIWORD 转换为 HANDLE
Posted
技术标签:
【中文标题】Win32 API - 将 LO/HIWORD 转换为 HANDLE【英文标题】:Win32 API - Converting LO/HIWORD to HANDLE 【发布时间】:2015-01-26 15:23:36 【问题描述】:我在理解一件特定的事情时遇到了一些麻烦。 我的电脑运行的是 64 位 Windows,所以
std::cout << sizeof(HANDLE) << std::endl;
std::cout << sizeof(HWND) << std::endl;
std::cout << sizeof(int*) << std::endl;
全部打印 8,即 8 个字节(64 位)。
现在,在窗口过程中
LRESULT __stdcall wndProc(HWND, UINT, WPARAM, LPARAM lParam)
WPARAM 和 LPARAM 的大小(以字节为单位)也是 8。 然而,我记得在 Petzold 的书中读到,有些消息的窗口句柄存储在 LPARAM 参数的 LOWORD 或 HIWORD 中。 例如,
HWND childHandle = (HWND)LOWORD(lParam);
这怎么可能? lParam的HIWORD,是32位整数的前两个字节吗?为了将句柄存储在 LPARAM 中,是否需要全部 8 个字节?
谢谢!
【问题讨论】:
***.com/questions/1822667/… 啊,谢谢,这个链接有一些很好的 cmets:msdn.microsoft.com/en-us/library/aa384203.aspx 64 位版本的 Windows 使用 32 位句柄来实现互操作性。在 32 位和 64 位应用程序之间共享句柄时,只有低 32 位有效,因此截断句柄(将其从 64 位传递到 32 位时)或对句柄进行符号扩展(将其从 32 位传递到 64 位时)。可以共享的句柄包括窗口(HWND)等用户对象的句柄、钢笔和画笔(HBRUSH 和 HPEN)等 GDI 对象的句柄,以及命名对象的句柄... 【参考方案1】:快速搜索到this MSDN page,指出此方法用于 16 位应用程序,并在迁移到 32 位架构后更改:
You extract the remaining two values in this way in the 16-bit framework:
HWND hWndCtrl = (HWND)LOWORD(lParam); //Control handle
int nCode = HIWORD(lParam); //Notification code
You extract them this way in the 32-bit framework:
HWND hWndCtrl = (HWND)lParam; //Control handle
int nCode = HIWORD(wParam); //Notification code
【讨论】:
【参考方案2】:您确定您没有读错示例并考虑控制 ID 吗?您的怀疑是正确的——HWND
是一个混淆指针,而不是一个 16 位值。
WM_COMMAND
,例如:
UINT wNotifyCode = HIWORD(wParam);
UINT wID = LOWORD(wParam);
HWND hwndCtl = (HWND)lParam;
【讨论】:
嗯,我希望我做到了。我再检查一下。以上是关于Win32 API - 将 LO/HIWORD 转换为 HANDLE的主要内容,如果未能解决你的问题,请参考以下文章
MSIL 教程:数组分支循环使用不安全代码和如何调用Win32 API(转)
[转]python使用ctypes模块调用windowsapi获取系统版本
签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP