Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Unity窗口获取WM_输入 关于_C++_Unity3d_Input_Windows Messages - Fatal编程技术网

C++ 从Unity窗口获取WM_输入 关于

C++ 从Unity窗口获取WM_输入 关于,c++,unity3d,input,windows-messages,C++,Unity3d,Input,Windows Messages,我试图为Unity构建一个自定义鼠标输入,直接从HID获取数据。我这样做是因为我想尝试一下,如果给我原始鼠标输入的UnityAPI有什么不同(当使用我自己的自定义鼠标输入时) 我还需要说,我现在所做的一切并不是在统一中发生的。我想建立一个C++应用程序,然后把数据传递给Unity(这不是这个问题的一部分)。 此链接()显示我可以使用三种不同类型的消息。由于我需要所谓的“高清鼠标移动”,我需要使用WM\u输入 如文档所示,WinProc处理程序可以捕获此消息。在该回调中,可以访问原始鼠标数据。这就

我试图为Unity构建一个自定义鼠标输入,直接从HID获取数据。我这样做是因为我想尝试一下,如果给我原始鼠标输入的UnityAPI有什么不同(当使用我自己的自定义鼠标输入时)

我还需要说,我现在所做的一切并不是在统一中发生的。我想建立一个C++应用程序,然后把数据传递给Unity(这不是这个问题的一部分)。 此链接()显示我可以使用三种不同类型的消息。由于我需要所谓的“高清鼠标移动”,我需要使用
WM\u输入

如文档所示,WinProc处理程序可以捕获此消息。在该回调中,可以访问原始鼠标数据。这就是我想要实现的目标,也是我需要帮助的地方

我目前的做法 文档(上面的链接)给出了注册鼠标的示例:

RAWINPUTDEVICE Rid[1];
Rid[0]。usUsagePage=HID\u用法\u页面\u通用;
Rid[0]。usUsage=HID\u用法\u通用\u鼠标;
Rid[0]。dwFlags=RIDEV\u INPUTSINK;
Rid[0]。hwndTarget=gameWindowHandle;
regDeviceOne=RegisterRarWinputDevices(Rid,1,sizeof(Rid[0]);
以下两行由我修改:

Rid[0].hwndTarget=gameWindowHandle;
在这里,我将Unity窗口定义为目标<代码>游戏窗口句柄由
枚举窗口
设置

由于语法错误(缺少括号),我更改的另一行是最后一行

就我对文档的理解而言,应该是这样的。现在,当有
WM_INPUT
消息发送到Unity窗口时,应调用以下回调

LRESULT回调WindowProc(
_在HWND HWND,
_在uuint uMsg,
_在WPARAM WPARAM,
_In_lparamlparam
) {
printf(“%d”,uMsg);
开关(uMsg){
案例WM_输入:
UINT dwSize=40;
静态字节lpb[40];
GetRawInputData((HRAWINPUT)LPRAM,RID_输入,
lpb和dwSize、sizeof(RAWINPUTHEADER));
RAWINPUT*raw=(RAWINPUT*)lpb;
if(原始->header.dwType==RIM\u TYPEMOUSE)
{
int xPosRelative=raw->data.mouse.lLastX;
int yPosRelative=raw->data.mouse.lLastY;
printf(“X:%d,Y:%d”,xPosRelative,yPosRelative);
}
打破
}
返回NULL;
}
我的问题 我遇到的第一个问题是打电话给这个

regDeviceOne=RegisterRarWinPutDevices(Rid,1,sizeof(Rid[0]);
不会像应该的那样返回true。相反,它返回false,
GetLastError
给我错误87(在谷歌搜索后,我发现这与错误的参数有关)

文档中说要这样做,但不幸的是,它没有像我那样工作

另一个问题是如何使应用程序保持活动状态。注册设备后,我需要等待回调触发(如果它们可以工作的话)。我如何才能实现应用程序除了等待回调之外什么都不做


我的方法是合理的还是完全错误的,必须使用不同的API?

你的方法是错误的。首先,RawInput需要窗口。由您自己的WndProc控制的窗口。因此,在C++库中,应该定义一个窗口过程。开始一个线程。在此线程中,使用该过程注册窗口类。成功注册类后,创建HWND_消息窗口,注册设备并输入while GetMessage。。。DispatchMessage循环。这应该在单独的线程中完成。在窗口过程中,您现在必须捕获WM_输入消息。享受

我将所有内容移植到一个CLR项目中,在该项目中我实例化了一个Windows窗体。不幸的是,我仍然得到“错误87:参数不正确”。非常感谢您的回复!我最终用一个C#Windows窗体应用程序解决了这个问题,在这个应用程序中,我获取WM#U输入消息并将它们传递给unity()。我把你的答案标记为正确,因为我犯的错误,正如你所说,我没有窗户。也许我会把C#解决方案移植到你的TIPP中。再次非常感谢!这是我在C++ C++原生DLL中的解决方案,你从C脚本中进行in/民意调查/删除。在C++中实现它将给你更好的原始性能。C++ DLL:C语言包装器: