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的主要内容,如果未能解决你的问题,请参考以下文章

转 python通过win32api轻松获取控件的属性值

转 Python使用win32api系统钩子

MSIL 教程:数组分支循环使用不安全代码和如何调用Win32 API(转)

python小功能记录——按键转点击事件

[转]python使用ctypes模块调用windowsapi获取系统版本

签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP