从Unity窗口获取WM_INPUT
Get WM_INPUT from Unity window
关于
我正在尝试为Unity构建一个自定义鼠标输入,它直接从HID获取数据。我这么做是因为我想尝试一下(当使用我自己的自定义鼠标输入时(给我原始鼠标输入的Unity API是否有任何差异。
我还需要说的是,我现在所做的一切都不是在团结内部发生的。我想构建一个C++应用程序,然后将数据传递给Unity(这不是这个问题的一部分(。
这个链接(MSDN高清鼠标移动(显示我可以使用三种不同类型的消息。由于我需要所谓的"高清鼠标运动",我需要使用WM_INPUT
。
如文档所示,可以使用WinProc处理程序捕获此消息。在该回调中,可以访问原始鼠标数据。这就是我想要实现的目标,也是我需要帮助的地方。
我目前的做法
文档(上面的链接(给了我这个注册鼠标的例子:
RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE;
Rid[0].dwFlags = RIDEV_INPUTSINK;
Rid[0].hwndTarget = gameWindowHandle;
regDeviceDone = RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
我修改了以下两行:
Rid[0].hwndTarget = gameWindowHandle;
在那里,我将Unity窗口定义为目标。CCD_ 2由CCD_。
由于语法错误(缺少括号(,我更改的另一行是最后一行。
就我对文档的理解而言,应该就是这样。现在,当有WM_INPUT
消息发送到Unity窗口时,应该调用以下回调。
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
) {
printf("%d", uMsg);
switch (uMsg) {
case WM_INPUT:
UINT dwSize = 40;
static BYTE lpb[40];
GetRawInputData((HRAWINPUT)lParam, RID_INPUT,
lpb, &dwSize, sizeof(RAWINPUTHEADER));
RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEMOUSE)
{
int xPosRelative = raw->data.mouse.lLastX;
int yPosRelative = raw->data.mouse.lLastY;
printf("X: %d, Y: %d", xPosRelative, yPosRelative);
}
break;
}
return NULL;
}
我的问题
我遇到的第一个问题是调用这个
regDeviceDone = RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
并没有像应该的那样返回true。相反,它返回false,GetLastError
给了我错误87(在谷歌上搜索后,我发现这与错误的参数有关(。
文件上说要这样做,但不幸的是,它没有像我那样工作。
另一个问题是如何保持应用程序的活力。注册设备后,我需要等待回调触发(如果它们能工作的话(。我如何才能实现应用程序除了等待回调之外什么都不做?
我的方法是否合理,或者我做得完全错误,必须使用不同的API?
您的方法是错误的。首先,RawInput需要Window。一个窗口在您的控制下与您自己的WndProc。因此,在C++库中,应该定义一个窗口过程。启动线程。在这个线程中,用那个过程注册窗口类。成功注册类后,创建HWND_MESSAGE窗口,注册设备并输入一段时间GetMessage。。。DispatchMessage循环。这应该在一个单独的线程中完成。在窗口过程中,您现在必须捕获WM_INPUT消息。享受
- "input.length();"的目的是什么?
- 如何使用"derived input class"创建派生类?
- "WM" C++是什么意思?
- 开放CV垫"Sizes of input arguments do not match"的问题
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- 如何检查输入是否为字符并显示它是"invalid input",否则它将按原样运行
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 无法在"surface input"模式下使用 Android 平台的 MediaCodec 类
- CMD:程序.exe 1< "A:/input.txt"产生无输出
- mmap with /dev/input/event*
- 如何应用注册表模式使"select class depend on input"遵守开放封闭原则?
- 为什么我应该使用 "int input{0};" 而不是"int intput;"
- 如何使Palindrome代码不必担心(用户input)单词间距
- 什么是 Python 的 map(int,input().split()) 的 C++ 等价物
- 如何从 Linux /dev/input/eventX 轮询输入
- 如果(玩家[P] .setCoin(Gameboard,Input))将其命名为“在线”游戏板的攻击函数)
- C++ if(cin>>input) 在 while 循环中无法正常工作
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- 如何在C++中分配“#input”类型的宏字符串
- NetBeans for Mac c++ Input