c# - 区分鼠标设备和低级鼠标 Hook

标签 c# setwindowshookex

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

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

最佳答案

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

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

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

有一个related discussion来自 GameDev SE 网站。

关于c# - 区分鼠标设备和低级鼠标 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67735338/

相关文章:

hook - Win32 将 DLL 注入(inject)到针对 "Any CPU"构建的应用程序中

c++ - 挂接到特定线程时,SetWindowsHookEx 返回 null

c - 保持 HOOK 运行

c# - 删除发送到 Json MVC 的对象的空属性

带有 SSL 到 Ubuntu VSFTPD 的 C# FtpWebRequest

C#,为什么 XmlSerializer 序列化基础对象而不是接口(interface)?

C# 转换函数命名约定

c# - 典型 3 层业务层中的静态方法与实例方法