如何在C ++ / CLI中读取原始输入

时间:2013-07-03 20:24:16

标签: c++ input keyboard c++-cli

这是我的问题。

我正在尝试从连接的设备获取原始输入。我正在使用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变量如何工作?如何正确创建和分配一个?

1 个答案:

答案 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);