c++ - Windows Precision Touchpad 单击/点击事件是否通过 WM_INPUT 消息进行通信?如果没有,我如何获得它们?

标签 c++ c windows winapi hid

我正在将自定义 Windows 触摸板处理添加到我的 Windows C++ 桌面应用程序中。从较高的层次来看,应用程序有自己的光标和可以单击的对象。光标需要由 Windows Precision Touchpad 直接控制,并与标准 Windows 鼠标完全解耦。我通过处理来自 WM_INPUT 消息的原始输入并使用低级鼠标 Hook 来防止控制正常的鼠标指针来实现此目的。

我可以使用 WM_INPUT 数据很好地解释单指和多指手势,但还没有弄清楚如何从触摸板获取“点击”或“轻击”。 Legacy Mouse Input事件显然不适用于我的用例,因为它们:

  1. 不是全局性的,并且要求我的应用具有针对性
  2. 由任何连接的鼠标/指点设备生成,而不仅仅是我注册的触摸板。
  3. 在 Windows 鼠标指针的位置进行交互,该位置不会驱动我的应用中的光标。

WM_INPUT 报告中是否包含点击/点击,而我只是无法找到它们,或者是否有其他方法可以仅从我的应用程序中的触摸板捕获原始点击?

最佳答案

RAWMOUSE带有 WM_INPUT 鼠标消息的结构体包含具有鼠标按钮向上/向下转换状态的 usButtonFlags

您无法获得点击/点击,因为据我所知,经典的 Win32 API 根本不适合触摸输入 - 它只是在触摸板的情况下模拟鼠标。

根据touchpad spec所有兼容的Windows Precision Touchpad都是HID设备,它们在其输入报告中发送触摸板数据。它们应包含相应的顶级集合 Page 0x0D(数字化仪)、Usage 0x05(触摸板) - 这将被视为与 Win32 用户模式分开的 HID 设备。查看示例HID Report Descriptor .

知道这一点后,您可以通过 RegisterRawInputDevices 调用注册接收触摸板数据。之后您将收到 WM_INPUT 消息 RAWHID每个 tounchpad input report 的结构- 这需要手动处理(根据设备的 Preparsed HID Report Descriptor Data 等)。

这并不容易,但可行。

参见example code here .

更新:还有WM_TOUCHWM_GESTURE自 Windows 7 起可用的消息。也许是 what you're looking forSample code .

关于c++ - Windows Precision Touchpad 单击/点击事件是否通过 WM_INPUT 消息进行通信?如果没有,我如何获得它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68087772/

相关文章:

c++ - Windows 上的 CPU Miner 编译

windows - 如何安全地回显文字字符串 "%I"?

c - Linux 进程调度程序

c - scanf 获取带有空格的两行输入

linux - GWT 编译器在 Linux 和 Windows 中的行为不同

.net - 连接到 SQL Server 2008 R2 Express 时出错

C++,linux,如何将非静态方法从单例传递给 pthread_create?

c++ - 我如何等待子进程结束

c++ 将 printf 与 wprintf 混合(或将 cout 与 wcout 混合)

c - 用于循环条件的 fork() 会产生竞争条件吗?