模拟鼠标移动(C#)

6

我应该如何制作一个小程序,使鼠标不断向上移动?


对于那些想知道的人,这只是一个一次性的小工具。我正在玩《星球大战:原力释放》。在游戏机版本中,您将向上按住右摇杆。但在 PC 上的糟糕游戏机移植版中,您需要使用鼠标。也许您可以理解我的沮丧。

3个回答

17

SetCursorPos 可以在非托管代码中实现此功能。我不确定是否有.NET方法可以做到相同的效果,但您可以始终使用COM互操作。它在User32.dll中。

[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);

通过简单的谷歌搜索,可以将此作为 .net 的 SetCursorPos 等效函数

System.Windows.Form.Cursor.Position

1
这肯定会移动鼠标。但游戏是否能得到正确的指示鼠标已移动? - Corin
1
尝试一下,它会作为副作用生成WM_MOUSEMOVE事件。(即使鼠标实际上没有移动,如果我没记错的话)。 - John Knoeller
那么这应该可以解决问题,而无需找到游戏窗口。 - Corin
是的,这也不会导致光标停留在游戏收到的上一个WM_MOUSEMOVE消息之外的其他位置。 - John Knoeller

17

这不是CSharp的问题,而是机械编程的问题。

  • 您需要插入第二个鼠标,并使用一个便宜的可变速有线钻。
  • 在钻头上安装砂轮滚筒,用条纹纸包裹起来,并将其设置为最低速度。
  • 然后在钻头非旋转的主体上放置一个支架,将鼠标与其传感器靠近旋转的条纹纸一起固定。
  • 确保鼠标面向正确方向以模拟向上移动。

要执行程序,请切换电源插座上的电源开关。

编辑:如果您想要更便携的代码,请使用无线钻。电池不包含在内。


它肯定能够工作,但并不完全是我所期望的答案。不过还是谢谢你。;) - Vivelin

3
我不了解这个游戏,但是在Windows内部,鼠标移动时会发送消息。这些消息通过SendMessage() API调用发送到应用程序。在C#中,您可以直接使用相同的Win32 API,或者通过创建/发送事件来实现。不确定如何向另一个正在运行的应用程序发送事件。
在C#中定义的SendMessage() Win32 API调用将如下所示:
[DllImport("user32.dll")]
        public static extern int SendMessage(
              int hWnd,     // handle to destination window
              uint Msg,     // message
              long wParam,  // first message parameter
              long lParam   // second message parameter
              );

1
这是唯一的希望。问题是如何获取正在运行的全屏DirectX或OpenGL游戏的句柄。 - John Rudy
我相信有一些API调用可以获取系统上所有活跃窗口及其对应的句柄...也许搜索一下? - Earlz
-1 这是一个不好的想法。WM_MOUSEMOVE消息是从队列中拉取原始鼠标移动事件和多个窗口过程消息(包括WM_NCHITTEST和WM_SETCURSOR)之间复杂交互的最后一步。绕过这些其他消息将会破坏那些具有稍微复杂鼠标处理的应用程序。 - John Knoeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接