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

时间:2018-09-25 12:53:04

标签: windows winapi c++-cli raw-input

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

我想我误解了如何从WM_INPUT消息中收集原始鼠标输入,但是我无法弄清楚。

我一直在寻找以下线程:How to accurately measure mouse movement in inches or centimetres for a mouse with a known DPI 和github上的Mouse输入库似乎都可以轻松捕获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函数的方法,无论程序是否在非活动窗口中运行,该函数都将保持活动状态。

我正在使用“ winuser.h”库在Visual Studio的空白C ++ CLR项目中运行此代码。

#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!!!");
        }

    }
}

1 个答案:

答案 0 :(得分:0)

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