区分鼠标设备和低级鼠标挂钩

Posted

技术标签:

【中文标题】区分鼠标设备和低级鼠标挂钩【英文标题】:Distinguish mice devices from a LowLevel mouse hook 【发布时间】:2021-05-28 08:20:42 【问题描述】:

我的计算机上有一个虚拟鼠标驱动程序和一个实际鼠标。

我正在使用 LowLevelMouseProc 来捕获窗口范围内的事件,我想处理来自虚拟鼠标的事件。

我无法使用 RawInput,因为我需要处理另一个进程的消息。

有什么方法可以知道是哪个设备发送了消息?

如果可能的话,在真正的鼠标设备上强制使用 dwExtraInfo 可能会对我有所帮助。

private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)

    MSLLHOOKSTRUCT hookStruct;
    if (nCode < 0)
    
        return CallNextHookEx(_hookId, nCode, wParam, lParam);
    
 
    hookStruct = (MSLLHOOKSTRUCT) Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));

    // I'd like to know from here which mouse has sent the message. 
    return CallNextHookEx(_hookId, nCode, wParam, lParam);

【问题讨论】:

【参考方案1】:

.NET Windows API 没有公开任何内容来区分不同的鼠标。曾经有一个Microsoft SDK for multiple inputs,但它在 Windows 10 之前被删除了,所以它可能不再工作了。

rawinput-sharp 展示了如何做到这一点,但顾名思义,它使用原始输入,我知道你说过你不想这样做。您对自己施加的这种限制使您陷入困境。这就像在说“我闭着眼睛怎么看屏幕?”

也许您可以以某种方式将这两个事件关联起来以获得您正在寻找的过滤器。或者,也许您可​​以过滤掉 LowLevelMouseProc 中的所有事件,并将来自一台设备的原始输入传递到 LowLevelMouseProc。

GameDev SE 网站上有一个related discussion。

【讨论】:

以上是关于区分鼠标设备和低级鼠标挂钩的主要内容,如果未能解决你的问题,请参考以下文章

电脑如何区分键盘USB和鼠标USB?

覆盖应用程序的低级键盘挂钩问题

如何区分鼠标“点击”和“拖动”

区分鼠标和键盘触发onclick

flutter web中如何区分手指触摸手势和鼠标指针手势?

如何区分鼠标的单击和双击事件