c# - 区分鼠标设备和 LowLevel 鼠标挂钩
问题描述
我的电脑上有一个虚拟鼠标驱动程序和一个实际鼠标。
我正在使用 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,但它在 Windows 10 之前被删除,因此它可能不再工作了。
rawinput-sharp显示了如何做到这一点,但顾名思义,它使用原始输入,我知道你说过你不想这样做。您对自己施加的这种限制使您陷入困境。这就像在说“我闭着眼睛怎么看屏幕?”
也许您可以以某种方式关联这两个事件以获得您正在寻找的过滤器。或者,也许您可以过滤掉 LowLevelMouseProc 中的所有事件,并将来自一台设备的原始输入传递到 LowLevelMouseProc。
GameDev SE 网站上有一个相关的讨论。
推荐阅读
- ruby-on-rails - 是否可以多次(开启)运行相同的自定义验证方法?
- android - 如何在 RecyclerView 中捕捉到项目的左侧
- python - 内置列表功能说明中的“/”是什么
- python - 如何通过 Tkinter 在 GUI 中使用 youtube 视频?
- python - 为什么我的 for 循环不会遍历列表的每个元素?
- angular - 不能绑定到“ngIf”,因为它没有使用 CommonModule?
- machine-learning - 嵌入向量修剪:获得描述类所需的最小嵌入向量集
- python - 创建检测文件的等效项以在 Mask RCNN 评估模型中使用
- pyspark - 如何将长数据帧转置为宽数据帧
- sql - SQL - 根据上次日期计算新条目