无法捕获 lParam 的 WM_INPUT 消息,无法收集原始鼠标输入

Trouble catching WM_INPUT message for lParam, to collect Raw Mouse Input

对于我的大学项目,我正在开发一种解决方案来区分帕金森氏症患者和健康人的鼠标用户数据。为此,我需要鼠标数据,最好是原始数据。

我想我误解了如何从 WM_INPUT 消息中收集原始鼠标输入,但我想不通。

我一直在看以下帖子:How to accurately measure mouse movement in inches or centimetres for a mouse with a known DPI 和 github 上的鼠标输入库,所有这些似乎都很容易捕获 WM_INPUT 消息,其 lParam 是某些 RawInputData 的句柄,如下所示:

GetMessage(&msg, GetActiveWindow(), WM_INPUT, 0);
if (msg.message == WM_INPUT){  .....

然后从消息中检索 lParam 并收集与该句柄关联的数据:

GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));

然而,当我在主循环中调用 GetMessage 时,该函数永远不会退出! 因此,我无法(据我所知)获得 RawInputData 的句柄。特别是因为 MSDN 页面假设您已经有了 lParam。

总而言之,我需要一种方法让 lParam 传递给 GetRawInputData 函数,无论程序是 运行 还是处于活动状态 window 中,该函数都将保持活动状态。

我 运行 此代码位于 Visual Studio 的空白 C++ CLR 项目中,带有 "winuser.h" 库。

#include "stdafx.h"
#include "Windows.h"
#include "winuser.h"

#ifndef HID_USAGE_PAGE_GENERIC
#define HID_USAGE_PAGE_GENERIC         ((USHORT) 0x01)
#endif
#ifndef HID_USAGE_GENERIC_MOUSE
#define HID_USAGE_GENERIC_MOUSE        ((USHORT) 0x02)
#endif

int main(array<System::String ^> ^args)
{
    RAWINPUTDEVICE Rid[1];
    Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
    Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE;
    Rid[0].dwFlags = 0; //ideally RIDEV_INPUTSINK but that prevents registration
    Rid[0].hwndTarget = GetActiveWindow(); //ideally this would be Null to be independent of the active window

    if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) {
        //registration failed. Call GetLastError for the cause of the error
        Console::WriteLine("Registration Error");
    }
    MSG msg;

    while (true) {
        while (GetMessage(&msg, GetActiveWindow(), WM_INPUT, 0) != 0) { //this command is never completed
            DispatchMessage(&msg); //this line is never ran
        }
        if (msg.message == WM_INPUT) {
            Console::WriteLine("caught a message!!!");
        }

    }
}

经过更多研究后问题已解决我发现 winAPI 演练通过添加以下内容解决了上述问题: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE unused, PSTR cmd, int show) {.....} 注册设备的函数,创建一个window然后调用GetMessage,调用LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {....},参数为消息ID,WParam和LParam对应的消息事件。 对于遇到类似问题的任何人,请遵循此 MSDN 指南:https://msdn.microsoft.com/en-us/library/bb384843.aspx