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

问题描述

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

我正在使用 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,lParam);
}

解决方法

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

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

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

GameDev SE 网站上有一个 related discussion

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...