我正在尝试从连接的设备获取原始输入。我正在使用MSDN上的信息来解决这个问题,但是我很难理解其中的一些信息。
我相信我已经成功创建了一个RAWINPUTDEVICE对象并使用RegisterRawInputDevices()注册了一个设备。现在我试图弄清楚如何使用GetRawInputDeviceList()和GetRawInputDeviceInfo()函数。最大的麻烦是试图了解它们所采用的参数,包括RAWINPUTDEVICELIST对象,HANDLE,LPVOID和PUINT。
这些变量是什么?如何使用它们?
头文件中的重要内容:
#include <Windows.h>
#include <Winuser.h>
CPP文件中的重要事项:
// I do not know where I found this not what it does, but it fixed some errors
// that I could not solve. MSDN did not mention it.
#pragma comment(lib, "user32.lib")
有效的东西,以及没有的东西:
RAWINPUTDEVICE rid[1];
rid[0].usUsagePage = 1;
rid[0].usUsage = 6;
rid[0].dwFlags = 0;
rid[0].hwndTarget = NULL;
// awesomeSauce returned true, so it works
bool awesomeSauce = RegisterRawInputDevices(rid, 1, sizeof(RAWINPUTDEVICE) );
// Nothing past this point works
UINT numDevices = GetRawInputDeviceList(NULL, NULL, sizeof(RAWINPUTDEVICELIST));
我对C ++有点生疏,你在这里看到的几乎就是我对原始输入的知识总和。我不知道它是否会影响任何东西,但我使用的是C ++ / CLI,而不是常规的C ++。我如何从这里获得某种无缓冲的原始输入(最好是从键盘上)?
我找到的大多数示例都有一个switch语句。我不明白它是如何工作的。我有这样的事情:
UINT msg; // How does this work?
switch(msg)
{
case WM_CREATE:
executeCase = 1;
break;
case WM_INPUT:
executeCase = 2;
break;
}
msg变量如何工作?如何正确创建和分配一个?
答案 0 :(得分:0)
根据GetRawInputDeviceList的MSDN页面,这里是第一个参数的文档(您将其作为null传递):
连接到系统的设备的RAWINPUTDEVICELIST结构数组。如果为NULL,则在* puiNumDevices中返回设备数。
这是返回值的文档:
如果函数成功,则返回值是pRawInputDeviceList指向的缓冲区中存储的设备数。
您为第一个参数传递null,并期望从该方法返回的设备数量。文档并没有说它会这样做。
为第二个参数传递一个实际变量,并读取该变量而不是返回代码。
如果这不能解决您的问题,请更具体地说明“这是不起作用的事情”。告诉我们如何它不起作用:是否会抛出异常,是否有错误返回代码,是否打开黑洞并吞下整个计算机?
在评论中,您仍然将返回值存储在numDevices中。此外,您将第二个参数用作数组。长度为1的数组基本上是相同的,但最好将其视为指向整数的指针。
以下是MSDN页面中示例代码的副本,其中添加了我的评论。试一试。
UINT nDevices;
PRAWINPUTDEVICELIST pRawInputDeviceList;
// Pass a null pointer to find out how many devices there are.
if (GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVCELIST)) != 0) { Error();}
// Now, malloc the needed storage, based on the output parameter, NOT the return value.
if ((pRawInputDeviceList = malloc(sizeof(RAWINPUTDEVICELIST) * nDevices)) == NULL) {Error();}
// Finally, call for real, passing in the newly allocated buffer.
if (GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST)) == (-1) {Error();}
// after the job, free the RAWINPUTDEVICELIST
free(pRawInputDeviceList);