我可以在低级挂钩过程中区分触摸板和鼠标消息吗? (Win32)
Can I distinguish touchpad and mouse messages within a low level hook proc? (Win32)
我正在努力将特定于触摸板的功能添加到 windows 桌面应用程序(用 C/C++ 编写)。这是我的要求:
- 用户应该能够同时使用标准 windows 鼠标和触摸板。
- 只要是 运行,所有触摸板 HID 事件都应由应用程序自定义处理。它不能控制鼠标或与其他人互动windows。
- 使用触摸板时,正常的鼠标操作不受影响。
通过研究 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输入。
我正在努力将特定于触摸板的功能添加到 windows 桌面应用程序(用 C/C++ 编写)。这是我的要求:
- 用户应该能够同时使用标准 windows 鼠标和触摸板。
- 只要是 运行,所有触摸板 HID 事件都应由应用程序自定义处理。它不能控制鼠标或与其他人互动windows。
- 使用触摸板时,正常的鼠标操作不受影响。
通过研究 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输入。