c# - 不同程序中的鼠标模拟

标签 c# windows winapi mouse device-emulation

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

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

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

由于红色警报是一个相当低的图形程序,所以在专门为我准备的虚拟机(带有 XP 客户端的 vmware 工作站)中运行它是微不足道的。如果您使用 mouse_event 代码,它运行良好,但是,我遇到的问题是找到正确的代码来表示鼠标移动。看起来 MOVE 标志相对移动鼠标,这是我不想要的,而 absolute 标签根本不移动鼠标。事实上,是它们的 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 时忽略某些程序的方式有关,可能是因为兼容模式?我现在没有其他游戏可以测试它,但我会在未来发布非兼容模式的结果。

  • 皮特

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

最佳答案

您必须执行一些低级别的 Windows 消息才能使其正常工作。使用 DirectX 的游戏(如 Red Alert)根本不会查看 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 是什么以及每个消息的 Msg 应该是什么。我敢肯定,如果您四处搜索,就可以找到针对每个事件发送的特定消息,例如鼠标移动、左键单击和右键单击。

祝你好运。

关于c# - 不同程序中的鼠标模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690953/

相关文章:

windows - 在驱动程序级别检索进程的命令行参数

c# - WPF 跟踪器多值

windows - 使用批处理脚本从文本文件中删除多行字符串

javascript - 使用 Razor/C# 循环遍历 HTML 表以获取每个 <tr> 中的数据

windows - 如何将命令行指令本身转储到输出文件中?

c++ - 是否有一种优雅的方式来处理 Windows OpenGL 应用程序中全屏和窗口模式之间的切换?

c++ - Windows RT on ARM native 代码调用约定是什么?

类中的 C++ 线程

c# - 将 ResourceDictionary 复制到 C# 中的字典

c# - 我需要一些 C# 泛型说明