我正在致力于将触摸板特定的功能添加到 Windows 桌面应用程序(用 C/C++ 编写)。这是我的要求:
- 用户应能够同时使用标准 Windows 鼠标和触摸板。
- 只要应用程序正在运行,所有触摸板 HID 事件都应由应用程序自定义处理。它不能控制鼠标或与其他窗口交互。
- 使用触摸板时不会影响鼠标的正常操作。
通过研究 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/