c++ - Win32 API - 将 LO/HIWORD 转换为 HANDLE

标签 c++ c winapi

我在理解一件特定的事情时遇到了一些困难。 我的电脑运行的是 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 中存储句柄,是否需要全部八个字节?

谢谢!

最佳答案

快速搜索会找到 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

关于c++ - Win32 API - 将 LO/HIWORD 转换为 HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28153123/

相关文章:

c++ - SystemParametersInfo 将壁纸设置为完全黑色(使用 SPI_SETDESKWALLPAPER)

c++ - Visual Studio 中的 native C++ 程序

c - C 的日志记录库

c - gcc 版本 4.6.3 上的 c 程序汇编版本

c++ - 如何将 unsigned int 转换为 unsigned char 数组

c++ - Windows系统加入Azure AD时获取登录用户的UserPrincipalName

c++ - 确保在外部进程中创建文件时刷新文件 (Win32)

c++ - 什么时候使用结构比在 C++ 中使用类更合理?

c++ - 没有默认构造函数的类数组的运算符 new

c++ - 使用 Loadlibrary ("cmd.exe")但不起作用