0

这是我的问题。

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

4

1 回答 1

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);
于 2013-07-03T20:52:39.523 回答