鼠标仿真在不同的程序



我正在开发自己的软件,使用c#和kinect SDK在我的电脑上操作鼠标。我真的很想用它来玩像《红色警报》这样的游戏,或者一些RTS,甚至只是一般的导航。

我发现的问题是,当使用不同鼠标的程序时,如红色警报或进入不支持鼠标集成的虚拟机,程序将不会拾起c#程序对System.Windows.Forms.Cursor调用的调用,更不用说mouse_event调用了。我是新的接口与窗口和这里发生了什么,有人可以解释/提出一个解决方案?

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

由于红色警报是一个相当低的图形程序,因此在专门为我设计的虚拟机(带有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,也许是因为兼容模式?我现在没有另一款游戏来测试它,但我会在未来发布不兼容模式的结果。

    Pete

(它不允许我在另外两个小时内发布答案,我必须睡觉去赶早上的航班!)

您将不得不做一些低级别的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是什么,以及每条消息的Msg应该是什么。我敢肯定,如果你四处搜索,你可以找到每个事件发送的特定消息,如鼠标移动,左键和右键单击。

好运。

相关内容

  • 没有找到相关文章

最新更新