这是一个简单的45 line console application,可以重现我的Win XP 32位系统上的错误。
相关部分:
input_watcher_wndproc
属于通过RegisterRawInputDevices设置的窗口,用于监视原始键盘输入事件。
LRESULT APIENTRY
input_watcher_wndproc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) {
switch(umsg) {
case WM_INPUT:
analyze_raw_input((HRAWINPUT)lparam);
DefWindowProc(hwnd, umsg, wparam, lparam);
return 0;
}
return DefWindowProc(hwnd, umsg, wparam, lparam);
}
void analyze_raw_input(HRAWINPUT raw_input) {
RAWINPUTHEADER header;
UINT size;
GetRawInputData(raw_input, RID_HEADER, &header, &size, sizeof(RAWINPUTHEADER));
printf("raw input device handle: %d\n", header.hDevice);
}
使用MSVC 9或10编译时,程序始终错误地将设备句柄报告为“1”。
但是,如果我应用一些看似无效的更改,比如将switch语句转换为if语句......
if (umsg == WM_INPUT) {
analyze_raw_input((HRAWINPUT)lparam);
DefWindowProc(hwnd, umsg, wparam, lparam);
return 0;
}
...或在调用analyze_raw_input
...
switch(umsg) {
case WM_INPUT:
puts("foo");
analyze_raw_input((HRAWINPUT)lparam);
DefWindowProc(hwnd, umsg, wparam, lparam);
return 0;
}
...代码运行正常并输出正确的设备句柄。
这是修改后的工作source code,只添加了print语句。
任何可能导致此行为的想法?
答案 0 :(得分:2)
确保在调用GetRawInputData之前将'size'初始化为sizeof(RAWINPUTHEADER),因为这是一个__inout参数。