gpt4 book ai didi

c++ - RAWINPUT 奇怪的行为

转载 作者:太空狗 更新时间:2023-10-29 19:52:32 30 4
gpt4 key购买 nike

我在使用 RAWINPUT 时出现一些奇怪的行为。下面的代码可以工作:

case WM_INPUT:
{
UINT rawInputSize;

GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, nullptr, &rawInputSize, sizeof(RAWINPUTHEADER));

LPBYTE inputBuffer = new BYTE[rawInputSize];

GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, inputBuffer, &rawInputSize, sizeof(RAWINPUTHEADER));

RAWINPUT* inp = (RAWINPUT*)inputBuffer; // valid
}

但以下内容不起作用:

case WM_INPUT:
{
UINT rawInputSize;
BYTE inputBuffer[40];

GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, inputBuffer, &rawInputSize, sizeof(RAWINPUTHEADER)); // returns error code

RAWINPUT* inp = (RAWINPUT*)inputBuffer;
}

也不是:

case WM_INPUT:
{
UINT rawInputSize;
RAWINPUT inputBuffer;

GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, &inputBuffer, &rawInputSize, sizeof(RAWINPUTHEADER)); // returns error code
}

两者都在 GetRawInputData() 处失败,返回一般错误代码(无详细信息)。

我首先发布的工作解决方案不是一个选项,我不能在每次击键或鼠标操作时都进行堆分配,我必须使用堆栈。

为什么最后两个失败了?

最佳答案

GetRawInputData的第4个参数, pcbSize, 有两个函数。输入时,它指定可用缓冲区的长度。退出时,它包含真正使用的数据的长度。这是 Windows API 中相当常见的概念。

在您的第一种情况下,第一次调用时,不使用输入值,退出时仅将所需的长度存储在那里。第二次调用有效,因为所需的长度仍然存在。

但是在你的第二个和第三个例子中,你没有初始化变量,所以它包含来自堆栈的随机垃圾。显然是 0 附近的东西,这使得函数失败。但这只是猜测,当然有很多方法无法正常工作、崩溃等。

你应该像这样初始化变量:

RAWINPUT inputBuffer;
UINT rawInputSize = sizeof(inputBuffer);
GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, &inputBuffer, &rawInputSize, sizeof(RAWINPUTHEADER));

作为旁注,在您的第二个示例中使用 BYTE[] 数组时要小心——一些 Alexander Belyakov 在 API 文档页面上发表了这个有用的评论:

On Win64, GetRawInputData would return -1 with ERROR_NOACCESS, unless the pData buffer is aligned by 8 bytes.

关于c++ - RAWINPUT 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24499477/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com