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

Can I distinguish touchpad and mouse messages within a low level hook proc? (Win32)

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

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

通过研究 Win32 API,我了解到 low level mouse hook 可用于阻止来自系统其余部分的 touchpad/mouse 输入。我有一个消息队列和简单的 hook proc 工作。

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 proc 中弄清楚消息是否是由触摸板设备生成的,只有在这种情况下才阻塞,这样鼠标才能正常工作。

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

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

因此,您将不得不使用这两种挂钩并协调它们 - 使用原始输入挂钩来识别触摸板事件,并使用 WH_MOUSE(不是 WH_MOUSE_LL)挂钩来阻止事件。

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

1:那篇文章是为键盘输入而写的,但应该也适用于mouse/touchpad输入。