Win32 API - 将LO / HIWORD转换为HANDLE

时间:2015-01-26 15:23:37

标签: 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中存储句柄,是否需要所有八个字节?

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你确定你没有读错样本并考虑控制ID吗?怀疑是正确的 - HWND是一个混淆的指针,而不是一个16位的值。

WM_COMMAND,例如:

UINT wNotifyCode = HIWORD(wParam); 
UINT wID = LOWORD(wParam); 
HWND hwndCtl = (HWND)lParam;