c++ - GetRawInputData 不适用于 x64 构建

标签 c++ winapi 64-bit user32

<分区>

GetRawInputData 适用于 x86 构建,但不适用于 x64。

UINT32 dwSize = 40;
static BYTE lpb[40];
GetRawInputData((HRAWINPUT)lparam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));

我用它来获取鼠标输入。在 x86 构建中,我得到了正确的值,但在 x64 上,它为 lLastX 和 lLastY 返回 0。

RAWINPUT* raw = (RAWINPUT*)lpb;

if (raw->header.dwType == RIM_TYPEMOUSE)
{
  int xPosRelative = raw->data.mouse.lLastX;
  int yPosRelative = raw->data.mouse.lLastY;
  ...

我几乎都在使用 Microsoft 网站上的代码,所以我不确定从哪里开始。谷歌没有帮助。谢谢!

最佳答案

dwSize 应设置为缓冲区的大小。两个目标上的缓冲区似乎大小不同(例如,由于整数大小不同,这是意料之中的)。

在下面的示例中,我任意选择了 65,000,但您需要为您的应用计算出正确的值。

dwSize = 65000;
BYTE * lpb = new BYTE[dwSize];
GetRawInputData((HRAWINPUT)lparam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));

关于c++ - GetRawInputData 不适用于 x64 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57496586/

相关文章:

c++ - 什么可能导致时间函数和 DLL 加载之间的死锁

c++ - 最小化窗口时会发送什么消息?

c# - 从 C++、C# 和 Java 的角度来看,Windows 编程是什么?

perl - 如何执行 64 位十六进制/十进制算术并将十六进制中的完整数字作为字符串在 Perl 中输出?

c++ std::bad_alloc on std::filesystem::path 追加

c++ - 将 auto 用于 boost::posix_time::time_duration 时出现错误 C2274: 'function-style cast' 的原因是什么?

c++ - 如何将事件处理程序添加到桌面窗口?

c# - 在 .Net 2.0 的 64 位应用程序中使用 32 位 DLL

c++ - 将位解压缩为单精度 float 的最快方法

c++ - Boost MPL 嵌套 lambda