【问题标题】:Mouse emulation in a different program不同程序中的鼠标仿真
【发布时间】:2011-12-31 22:49:08
【问题描述】:

我正在开发自己的软件,以使用 C# 和 kinect SDK 在我的计算机上操作鼠标。我真的很想尝试用它来玩 Red Alert 之类的游戏,或某种 RTS,甚至只是用于一般导航。

我发现的问题是,当使用具有不同鼠标的程序时,例如红色警报或进入不支持鼠标集成的虚拟机时,程序将无法接收 C# 的调用程序正在对 System.Windows.Forms.Cursor 调用进行调用,更不用说 mouse_event 调用了。我是与 windows 交互的新手,这里发生了什么,有人可以解释/提出解决方案吗?

--更新-- 作为更新,我仍然不完全确定发生了什么,但我似乎找到了特别是红色警报的解决方法;

由于红色警报是一个相当低级的图形程序,因此在专门为我设计的虚拟机(带有 XP 客户端的 vmware 工作站)中运行它是微不足道的。如果您使用 mouse_event 代码,它工作得很好,但是,我一直在努力寻找正确的代码来表示鼠标移动。似乎 MOVE 标志相对移动鼠标,这是我不想要的,而绝对标签根本没有移动鼠标。事实上,在屏幕上产生绝对移动的是它们的 OR,所以我的鼠标移动和点击模拟代码最终看起来像这样:

mouse_event((int)0x00000002, cursor.X, cursor.Y, 0, 0);

用于点击和

mouse_event((int)(0x00000001 | 0x00008000), x, y, 0 0);

用于鼠标移动,其中 x 和 y 是 65535(绝对范围)之外的新坐标。完美吗?不。但它现在有效。我认为与Windows在运行ra时忽略某些程序的方式有关,可能是因为兼容模式?我现在没有其他游戏可以测试它,但我会在未来发布不兼容模式的结果。

  • 皮特

(它不会让我再发布两个小时作为答案,我必须睡觉才能赶上早上的航班!)

【问题讨论】:

  • 我建议使用 SendInput 函数而不是已弃用的 mouse_event 函数。

标签: c# windows winapi mouse device-emulation


【解决方案1】:

您必须执行一些低级别的 Windows 消息才能使其正常工作。像 Red Alert 这样使用 DirectX 的游戏根本不会查看 System.Windows.Forms.Cursor。您将需要与 Windows User32.dll 交互以将适当的消息发送到 Windows,以便它可以将它们适当地路由到其他应用程序。

这里有一些代码可以帮助您开始研究通过 C# 中的 User32 DLL 发送消息:

    [DllImport("USER32.DLL")]
    public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);

    // Activate an application window.
    [DllImport("USER32.DLL")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

我希望这可以帮助您入门,但我没有时间浏览每条鼠标消息,wParam 和 lParam 是什么,以及每个消息应该是什么。我敢肯定,如果您四处搜索,您可以找到要为每个事件发送的特定消息,例如鼠标移动、左键单击和右键单击。

祝你好运。

【讨论】:

  • 实际上,使用 DirectX 的游戏也不会使用 GetMessage(),所以 SendMessage() 很可能没有效果。你需要更低级别的东西。我所知道的最底层的东西是 mouse_event()。
  • 现在我有一些有点 hacky 的东西。我正在使用 mouse_event() 来单击鼠标,并且我也在尝试使用 SetCursorPos() 来移动鼠标。也许我错过了重绘或其他什么?但是当 mouse_event 被调用时,它会正常工作并在它应该(并单击)的地方重绘鼠标,但 SetCursorPos() 没有。当前代码:[DllImport("user32.dll", EntryPoint = "SetCursorPos")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetCursorPos(int x, int y);
  • 我还应该提到 mouse_events() 在普通机器上似乎根本不起作用,我什至从 mouse_event 得到任何响应的唯一方法是尝试在虚拟机上运行它(我想如果我让所有输入都通过虚拟思想是一个来源,它可能会起作用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多