- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用 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/
我将 rawinput 与 directx 一起使用...我正在尝试在使用鼠标滚轮时使用相机进行缩放...当我使用以下代码运行程序时,我从 usbuttondata 的 rawinput 获取的数据会
我在使用 RAWINPUT 时出现一些奇怪的行为。下面的代码可以工作: case WM_INPUT: { UINT rawInputSize; GetRawInputData((H
我目前正在使用 Windows 的 RawInput API 来访问键盘和鼠标输入。我有点困惑的一件事是,当我将鼠标注册为 RawInputDevice 时,我无法移动我的 Win32 窗口或使用那里
在查看 RAWINPUT 结构的 MSDN 文档时,它有以下声明: typedef struct tagRAWINPUT { RAWINPUTHEADER header; union {
我正在使用 RawInput处理击键。我发现很难确定 shift 键是否与某个键一起按下。 来自RawInputStructure -> RawKeyboard ,我可以检索被按下的键,但我不确定如果
我正在将一个应用程序从 DirectInput 切换到 RawInput 以处理游戏 handle ,我想为每个游戏 handle 提供一个人类可读的描述。理想的是出现在设备管理器中的设备文本,但 U
我正在尝试使用 SlimDX 和 RawInput 为太空游戏设置键盘和鼠标控件。我目前的代码如下: Device.RegisterDevice(UsagePage.Generic, UsageId.
我正在开发一个应该从 USB 秤获取数据的 Windows 窗体应用程序。USB 秤的处理方式类似于键盘。如果有人在体重秤上放东西,体重秤就会像 USB 键盘一样开始输入重量字符串。之前,我通过单击
我正在尝试使用以下方法从 HID 设备读取数据: uint dwsize = 0; //RAWINPUT input = new RAWINPUT(); uint result = GetRawInp
目前,我正在编写一个程序来拦截来自特定键盘的击键(使用其 HID 进行过滤)。因此,为了了解特定设备发送了哪些击键,我使用了 RawInput 技术,灵感来自这个很棒的教程: http://www.c
似乎无法打印触摸阶段的字符串值已尝试过: let phase = NSTouch.Phase(rawValue: touch.phase.rawValue) print(phas
Python 中 Rawinput 的 C# 等价物是什么? 如何在 C# 控制台应用程序中读取用户输入? 最佳答案 使用这个 Console.ReadLine() 或一个字符 Console.Rea
我是一名优秀的程序员,十分优秀!