我在理解一件特别的事情时遇到了一些麻烦。 我的电脑正在运行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中存储句柄,是否需要所有八个字节?
谢谢!
答案 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;