Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何模拟实际移动鼠标(C#)_C# - Fatal编程技术网

如何模拟实际移动鼠标(C#)

如何模拟实际移动鼠标(C#),c#,C#,我想要的是,让计算机认为我在实际地朝我移动鼠标。我正在制作一个程序,可以将输入发送到游戏中。我成功地让它以编程方式接收键盘输入,但遇到了鼠标问题 游戏中通常使用第一人称视角,中间有一个点。当打开菜单或地图时,它有一个光标,但只有在此时。我已经测试了一些鼠标输入的建议,但游戏只有在我使用光标移动的模式下才会响应,就像地图或菜单一样,但在其他情况下不会响应 我想要的是,当我处于第一透视正常播放模式时,我的化身向下看,当我向下移动鼠标时,它就会这样做。由此我推断,任何试图移动光标的方法都是无效的,因为

我想要的是,让计算机认为我在实际地朝我移动鼠标。我正在制作一个程序,可以将输入发送到游戏中。我成功地让它以编程方式接收键盘输入,但遇到了鼠标问题

游戏中通常使用第一人称视角,中间有一个点。当打开菜单或地图时,它有一个光标,但只有在此时。我已经测试了一些鼠标输入的建议,但游戏只有在我使用光标移动的模式下才会响应,就像地图或菜单一样,但在其他情况下不会响应

我想要的是,当我处于第一透视正常播放模式时,我的化身向下看,当我向下移动鼠标时,它就会这样做。由此我推断,任何试图移动光标的方法都是无效的,因为游戏模式没有正常的光标。我需要让电脑本身认为鼠标已经被移动了,更不用说光标了


(作为参考,我尝试过的一件事是),以及使用导入的SendInput的其他示例。

有几种方法可以实现您想要的。我以前使用过,效果很好。您可以在这个问题中看到它的示例用法

其他方法:

发送输入(已尝试):模拟按键和鼠标移动的最基本方法。现在大多数游戏都会因为脚本的滥用而被屏蔽,比如机器人、宏、反瞄准/反冲

<强>鼠标事件:可以在上面找到C++引用。你可以选择这个方法并使用它

游戏内部:在内存中找到本地玩家的游戏角度,并在内存中写入要查看的新游戏角度。Github上有很多例子

AutoIT:如果可行,您可以尝试使用它,了解它如何模拟鼠标移动

内核:您可以在这方面找到一个很好的例子。感谢@CaiusJard

其他来源


其他想法
我相信您将遇到的问题是,这些方法中的大多数都被归类为
软件
输入,许多游戏和游戏引擎出于安全目的会阻止这些输入。我认为,要真正在一定程度上模拟硬件输入,您需要使用Arduino或实际的自定义硬件,因为我从来没有找到一种不可取消锁定的方法。

所有windows事件都来自一个。您可以读取并发布到队列您可以通过如下方式访问user32.dll来发布鼠标事件:

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
   public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
在windows中,所有事件都有硬编码的值,在c#中,我们会将它们分组到一个枚举中,我想,但最终它都只是一个数字,在代码中定义:

   private const int MOUSEEVENTF_LEFTDOWN = 0x02;
   private const int MOUSEEVENTF_LEFTUP = 0x04;
   private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
   private const int MOUSEEVENTF_RIGHTUP = 0x10;
然后,您可以播放鼠标并按如下方式发送单击:

   public void DoMouseClick(int mouseX, int mouseY)
   {
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, mouseX, mouseY, 0, 0);
   }
您可以通过链接来调用所有windows dll。PostMessageA也一样。它可以用来发送所有信息(你点击了上面的链接了吗?)。您可以查看的文档。有一个很好的链接和示例网站,名为,其中有很多

请注意,当您发布鼠标单击时,您的防病毒软件可能会注意到您的应用程序,如果可能,请尝试呼叫代理,而不是发送鼠标坐标


如果你想做自动化的UI测试,那么有很多工具可以帮你。看一看

你的问题现在还没有真正的答案。你已经试过了。发生了什么,你们期望发生什么?第一人称射击游戏在角色不在菜单中时锁定鼠标输入是很常见的。你有没有看过
鼠标事件
也许创建自己的虚拟鼠标驱动程序是不可阻止的?@CaiusJard Great shout,愚蠢的我忘记了内核。我将在问题中链接是的,你可以这样做,但是你需要用一个相当昂贵的证书签署驱动程序。绝对正确,我现在忘记了内核的威力!可以始终使用驱动程序加载程序,但这并不理想。