Pet*_*rtz 6 c# windows mouse winapi device-emulation
我正在使用自己的软件在我的计算机上使用C#和kinect SDK操作鼠标.我真的想尝试使用它来玩像红色警报,或某种RTS,甚至只是一般导航的游戏.
我发现的问题是,当使用带有不同鼠标的程序,如红色警报或进入不支持鼠标集成的虚拟机时,程序将无法接收C#程序正在进行的调用到System.Windows.Forms.Cursor调用,更不用说mouse_event调用了.我是新手与Windows接口以及这里发生了什么,有人可以解释/提出解决方案吗?
--UPDATE--作为更新,我仍然不完全确定发生了什么,但我似乎特别找到了红色警报的解决方法;
由于红色警报是一个相当低的图形程序,因此在虚拟机中专门为我,带有XP客户端的vmware工作站运行它是微不足道的.如果你使用mouse_event代码它运作良好,但是,我遇到的一件事就是找到代表鼠标移动的正确代码.似乎MOVE标志相对移动了鼠标,这是我不想要的,绝对标签根本没有移动鼠标.事实上,它们的OR在屏幕上产生绝对移动,因此我的鼠标移动和点击模拟代码最终看起来像这样:
mouse_event((int)0x00000002, cursor.X, cursor.Y, 0, 0);
Run Code Online (Sandbox Code Playgroud)
点击和
mouse_event((int)(0x00000001 | 0x00008000), x, y, 0 0);
Run Code Online (Sandbox Code Playgroud)
对于鼠标移动,其中x和y是65535(绝对范围)之外的新坐标.它完美吗?罗.但它现在有效.我认为这与Windows运行ra时忽略某些程序的方式有关,可能是因为兼容模式?我现在没有其他游戏可以测试它,但我将来会以非兼容模式发布结果.
(它不会让我作为另外两个小时的答案发布,我必须在早上睡觉去赶飞机!)
您将必须执行一些低级别的窗口消息才能使其正常工作。使用 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);
Run Code Online (Sandbox Code Playgroud)
我希望这能让您开始,但我没有时间仔细检查每个鼠标消息、wParam 和 lParam 是什么以及每个消息的 Msg 应该是什么。我确信,如果您四处搜索,您可以找到为每个事件发送的特定消息,例如鼠标移动、左键单击和右键单击。
祝你好运。