【问题标题】:How Do I Read Raw Input in C++/CLI如何在 C++/CLI 中读取原始输入
【发布时间】:2013-07-01 16:50:59
【问题描述】:

这是我的问题。

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

【问题讨论】:

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


    【解决方案1】:

    根据GetRawInputDeviceList 的 MSDN 页面,这里是第一个参数的文档(您将其作为 null 传递):

    连接到系统的设备的 RAWINPUTDEVICELIST 结构数组。如果为 NULL,则在 *puiNumDevices 中返回设备数量。

    这里是返回值的文档:

    如果函数成功,返回值为pRawInputDeviceList指向的缓冲区中存储的设备数。

    您将 null 传递给第一个参数,并期望该方法的返回中存在设备数。文档没有说它会这样做。

    为第二个参数传递一个实际变量,并读取它而不是返回代码。

    如果这不能解决您的问题,请更具体地说明“这是行不通的事情”。告诉我们如何它不起作用:它是否会引发异常、是否有错误返回码、黑洞是否会打开并吞下您的计算机?


    编辑

    在您的评论中,您仍然将返回值存储在 numDevices 中。此外,您将第二个参数用作数组。长度为 1 的数组基本上是一样的,但最好将其视为指向整数的指针。

    这是来自 MSDN 页面的示例代码副本,其中添加了我的 cmets。试试这个。

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

    【讨论】:

    • 这是我的尝试。我不确定如何获得结果。它返回 -1,MSDN 表示该函数不成功。 // 第一个参数 RAWINPUTDEVICELIST inDevice[1]; inDevice[0].hDevice = NULL; // 不确定如何使用句柄 inDevice[0].dwType = RIM_TYPEKEYBOARD; // 第二个参数 UINT numKeyboards[1];数字键盘[0] = 1; UINT numDevices = GetRawInputDeviceList(inDevice, numKeyboards, sizeof(RAWINPUTDEVICELIST)); // 结果:numDevices == -1
    • 您编辑的部分代码有效。我用 malloc 构建错误,所以我把它忽略了,但 GetRawInputDeviceList 没有返回 -1,这告诉我它有效。我承认我现在真的不知道该怎么办。我设法让 GetRegisteredRawInputDevices 返回 1,我认为这意味着我已经注册了一个键盘。如果我没有遗漏任何内容,我现在将尝试弄清楚如何实际获取原始输入。
    • malloc 是您在 C 中分配内存的方式。没有它,pRawInputDeviceList 是一个未初始化的指针,它可能指向也可能不指向有效内存。 您在尝试使用 malloc 时遇到了什么错误?
    • 它说:“错误 C2440: '=' : cannot convert from 'void *' to 'PRAWINPUTDEVICELIST'” 我猜这实际上是使用等号的方式有问题。我在 malloc 上读到的东西说要在 C++ 中使用 new 运算符,但我不知道如何将你的赋值与 new 运算符一起使用。
    猜你喜欢
    • 2019-05-16
    • 2012-07-24
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2016-02-02
    相关资源
    最近更新 更多