Windows 捕捉LPRAM的WM_输入消息以收集原始鼠标输入时出现问题

Windows 捕捉LPRAM的WM_输入消息以收集原始鼠标输入时出现问题,windows,winapi,c++-cli,raw-input,Windows,Winapi,C++ Cli,Raw Input,在我的大学项目中,我正在开发一种解决方案,以区分患有帕金森病的人和健康人的鼠标用户数据。我需要鼠标数据,最好是原始数据 我想我误解了如何从WM_输入消息中收集原始鼠标输入,但我无法理解 我一直在关注以下线索: github上的鼠标输入库,所有这些似乎都可以轻松捕获WM_输入消息,其LPRAM是一些RawInputData的句柄,如下所示: GetMessage(&msg, GetActiveWindow(), WM_INPUT, 0); if (msg.message == WM_INP

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

我想我误解了如何从WM_输入消息中收集原始鼠标输入,但我无法理解

我一直在关注以下线索: github上的鼠标输入库,所有这些似乎都可以轻松捕获WM_输入消息,其LPRAM是一些RawInputData的句柄,如下所示:

GetMessage(&msg, GetActiveWindow(), WM_INPUT, 0);
if (msg.message == WM_INPUT){  .....
然后从消息中检索LPRAM,并使用以下方法收集与该句柄关联的数据:

GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));
但是,当我在主循环中调用
GetMessage
时,函数永远不会退出! 因此,我无法(据我所知)获得RawInputData的句柄。尤其是因为MSDN页面只是假设您已经有了LPRAM

总之,我需要一种方法来获取一个LPRAM,以传递给
GetRawInputData
函数,该函数将保持活动状态,无论程序是否在活动窗口中运行

我在VisualStudio中的空白C++ CR项目中运行这个代码,并使用“WiSux.h”库。< /P>
#包括“stdafx.h”
#包括“Windows.h”
#包括“winuser.h”
#ifndef隐藏\u使用\u页面\u通用
#定义HID\u用法\u页面\u通用((USHORT)0x01)
#恩迪夫
#ifndef隐藏\u使用\u通用\u鼠标
#定义HID\u用法\u通用\u鼠标((USHORT)0x02)
#恩迪夫
int main(数组^args)
{
RAWINPUTDEVICE Rid[1];
Rid[0]。usUsagePage=HID\u用法\u页面\u通用;
Rid[0]。usUsage=HID\u用法\u通用\u鼠标;
Rid[0].dwFlags=0;//理想情况下为RIDEV\u INPUTSINK,但这会阻止注册
Rid[0].hwndTarget=GetActiveWindow();//理想情况下,该值为Null,独立于活动窗口
if(registerRarWinPutDevices(Rid,1,sizeof(Rid[0]))==FALSE){
//注册失败。请调用GetLastError以了解错误原因
控制台::WriteLine(“注册错误”);
}
味精;
while(true){
而(GetMessage(&msg,GetActiveWindow(),WM_INPUT,0)!=0){//此命令永远不会完成
DispatchMessage(&msg);//此行从未运行过
}
if(msg.message==WM_输入){
控制台::WriteLine(“捕捉到消息!!!”;
}
}
}

问题解决经过更多研究,我找到了winAPI演练,随后通过添加一个:
int-WINAPI-WinMain(HINSTANCE-HINSTANCE,HINSTANCE-unused,PSTR-cmd,int-show){….}
函数注册设备并创建一个窗口,然后调用
GetMessage
,该窗口调用
LRESULT回调WndProc(HWND-HWND,UINT-msg,WPARAM-wp,LPARAM-lp){..}
,其中的参数由消息事件对应的消息ID、WPARAM和LPARAM占用。
对于遇到类似问题的任何人,请遵循此MSDN指南:

WM_输入的文档说明:“只有当应用程序调用具有有效设备规范的
RegisterRarWinputDevices
时,原始输入才可用。”。你的应用程序会这样调用吗?问题可能在任何地方,我们需要看到一个。很抱歉缺少代码,我编辑了我的原始帖子,感谢反馈:)。如果我错了,请原谅我,但我从那篇文章中得到的是,我应该通过传递
GetMessage从
GetMessage
函数中删除hwnd过滤器(&msg,NULL,0,0)
相反,这会导致与以前相同的行为,
GetMessage
从不返回值。有趣的是,
peekMessage
确实会在
msg
对象中返回和设置值。但是我怀疑这是否确实是有效的代码:
而(true){peekMessage(&msg,NULL,0,0,0);if(msg.message==WM_输入){Console::WriteLine(“找到WMM_输入消息”);}
#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!!!");
        }

    }
}