c++ - 我可以在低级 Hook 过程中区分触摸板和鼠标消息吗? (Win32)

标签 c++ c windows winapi hid

我正在致力于将触摸板特定的功能添加到 Windows 桌面应用程序(用 C/C++ 编写)。这是我的要求:

  1. 用户应能够同时使用标准 Windows 鼠标和触摸板。
  2. 只要应用程序正在运行,所有触摸板 HID 事件都应由应用程序自定义处理。它不能控制鼠标或与其他窗口交互。
  3. 使用触摸板时不会影响鼠标的正常操作。

通过研究 Win32 API,我了解到 low level mouse hook可用于阻止系统其余部分的触摸板/鼠标输入。我有一个消息队列和简单的钩子(Hook)过程正在工作。

static LRESULT CALLBACK lowLevelHIDHookProc
    (
    int                 nCode,
    WPARAM              wParam,
    LPARAM              lParam
    )
{
HHOOK ignored( NULL );

// have to pass message along to next hook
if( nCode < 0 )
    {
    return( CallNextHookEx( ignored, nCode, wParam, lParam ) );
    }
// THIS IS WHAT I CAN'T FIGURE OUT
else if( eventComingFromNormalMouse ) // allow normal mouse events
    {
    return( CallNextHookEx( ignored, nCode, wParam, lParam ) );
    }
// block touchpad stuff here
else
    {
    printf( "********\nTOUCH INTERCEPTED!!!\n********\n" );
    return( -1 );
    } 

我现在所坚持的是区分来自触摸板和普通鼠标的鼠标消息。我发现了几个使用 HID 的开源项目和示例 Raw Input为了检测和读取通用触摸板数据,但是在使用触摸板时禁用鼠标光标就可以了。相反,我需要在这个钩子(Hook)过程中弄清楚该消息是否是由触摸板设备生成的,并且只有在这种情况下才会阻止,以便鼠标可以正常工作。

我正在查看 lParam/MSLLHOOKSTRUCT documentation ,但我没有看到任何看起来有助于做出这种区分的东西。我对任何想法持开放态度,包括根本不使用低级 Hook ,因为它们会影响性能。也许有一种方法可以打开与 USB 触摸板的串行连接,而 Windows 根本不会将其检测为 HID 设备?

最佳答案

SetWindowsHookEx() Hook (如 WH_MOUSE_LL)不提供有关生成输入事件的设备的任何标识信息。原始输入 Hook 可以识别设备,但无法阻止输入事件。

因此,您必须使用两种 Hook 并协调它们 - 使用原始输入 Hook 来识别触摸板事件,并使用 WH_MOUSE (而不是 WH_MOUSE_LL ) Hook 来阻止事件。

但是,要可靠地做到这一点并不容易。。请参阅Combining Raw Input and keyboard Hook to selectively block input from multiple keyboards 1 了解更多信息和陷阱。

1:该文章是针对键盘输入编写的,但也应该适用于鼠标/触摸板输入。

关于c++ - 我可以在低级 Hook 过程中区分触摸板和鼠标消息吗? (Win32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67841980/

相关文章:

c++ - 避免在直接派生类中用 C++ 定义纯虚函数?

c++ - 为什么这个程序不打印出十六进制值?

c - 实现广度优先搜索时的错误 (C)

C 中函数的冲突类型

c - C 编译器如何知道如何将不同类型的值放入分配的内存中? (使用malloc)

c - 参加事件时 sleep

c# - 让 C# 和 C++ 一起玩得很好

c++ - 将 Q_GADGET 作为信号参数从 C++ 传递到 QML

windows - 如何保护 SQLite 数据库?

windows - echo 命令在写入文本文件时是否附加任何额外字符?