Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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#_Windows_Input_Keyboard_Simulation - Fatal编程技术网

C# 如何在所有应用程序中模拟键盘输入?

C# 如何在所有应用程序中模拟键盘输入?,c#,windows,input,keyboard,simulation,C#,Windows,Input,Keyboard,Simulation,我正在写一个应用程序(用C#)作为它的一部分,它必须模拟并向另一个应用程序发送一些按键。我使用project来模拟按键,它在许多应用中都能工作,但在一些应用中却不能——例如《凡人之战4》 我在谷歌上搜索了一下,发现了很多答案,从“不可能”到“你必须使用XXX图书馆”等等。这些答案让我非常害怕,甚至几乎确信我当时做不到,但是 M$虚拟键盘有效。它适用于所有应用程序。所以有可能。。。你们当中有谁,聪明的家伙,知道我怎样才能做到这一点吗?看看MSDN上的内容好吧,我想我终于成功了。我使用了NealP推

我正在写一个应用程序(用C#)作为它的一部分,它必须模拟并向另一个应用程序发送一些按键。我使用project来模拟按键,它在许多应用中都能工作,但在一些应用中却不能——例如《凡人之战4》

我在谷歌上搜索了一下,发现了很多答案,从“不可能”到“你必须使用XXX图书馆”等等。这些答案让我非常害怕,甚至几乎确信我当时做不到,但是


M$虚拟键盘有效。它适用于所有应用程序。所以有可能。。。你们当中有谁,聪明的家伙,知道我怎样才能做到这一点吗?

看看MSDN上的内容

好吧,我想我终于成功了。我使用了NealP推荐的API监视器,它显示了OSK调用和我的调用之间的最小差异。稍晚一点,我尝试让我的呼叫线程在使用按键和释放键发送消息之间休眠一段时间,就是这样。

虽然您能够实现您的目的,但实现它的方式并不能从根本上回答您的问题:如何在所有应用程序中模拟键盘输入

在很多情况下,前面提到的通用用户模式Microsoft API不起作用,例如使用DirectInput API的游戏应用程序或受保护的游戏


我已经构建了一个可以在这种情况下提供帮助的,它提供了一个简单的C API,可以在内部与设备过滤器驱动程序进行通信。它能够为基于DirectInput的游戏发送输入,也能够绕过一些游戏保护。我已经检查过了,它仍然能够通过使用x64版本的库绕过一些已知的游戏保护。游戏保护通常只钩住x86系统的api。好了,现在终于到了2012年2月18日,这就是我所看到的情况。

到目前为止,您实际使用了哪些代码,您已经尝试过了……我正在使用上面提到的项目。最低的方法是[DllImport(“user32.dll”,SetLastError=true)]内部静态外部UInt32 SendInput(UInt32 numberOfInputs,InputMsg[]inputs,Int32 sizeOfInputStructure);它在许多应用程序中都能完美运行,但并非所有应用程序都能如此/@FenixVoltres:我对屏幕上的Windows键盘进行了反向工程,它使用与您链接到的库相同的输入方法(
SendInput
)。我钩住了脑海中所有与键盘相关的函数(
keybd_event
SendInput
SetKeyboardState
,等等),唯一调用的函数是
SendInput
)。尝试根据MSDN文档仔细检查库的代码。哇,请尊重这一点。:)好的,这让我确信这是可能的。但奇怪的是它不起作用。我将尝试三次阅读所有关于这方面的文档。也许是一些与键盘没有直接联系的事情,比如聚焦?我没有在任何地方设置任何焦点(但它在某些应用程序中有效);我认为使用API monitor()监控程序执行会更容易,因为只有少数函数能够以这种方式生成输入。您应该记录上面的那些函数,以及与扫描代码相关的任何函数(它们应该属于同一类别)。我尝试了一下,但同样的情况也发生了-SendKeys.Send(string)可以工作,但不是在每个应用程序中都可以。记事本或浏览器可以正确地处理它,但我无法让它在任何全屏游戏中工作。大多数较新的在线游戏都会煞费苦心地试图阻止人们编写“机器人”程序,所以这比说向记事本发送击键要难一点。你仍然可以通过使用低级的Win32.dll api调用来绕过他们的一些努力,但是你会承担责任,当然这取决于你住在哪里,所以我把研究留给你来解决。如果那些方法不是我使用过的,你能说一两句话吗?事实上,这个项目是一个更广泛的工作的一部分,这是我在波兰Cracow的AGH科技大学的学士学位最终计划,我不想违反任何法律。顺便说一句,做一个虚拟键盘(或者在我的情况下是一种新的计算机输入方法)是完全合法的,我想?你是对的,DirectInput是我的痛苦所在。我不得不停止开发我的应用程序一段时间,但我肯定会在接下来的几天内检查你的库,这似乎是我一直在寻找的东西。@FenixVoltres另外,由于目前我只支持普通的C API,一个用户贡献了一个C#项目,P/Invoke在github提供了它,您可以检查是否有其他人试图使用API监视器,它将只显示输入数组中的第一个数组项,即,如果您将一个包含4个项的数组传递给SendItem(例如,OSK在关闭以模拟LWIN keydown、U keydown、U keydup、LWIN keydup时执行此操作)。要能够在参数窗口中查看整个阵列,请编辑安装API监视器的“\API\Windows”目录中的User32.xml文件,并将行更改为如何使其工作?我正试图解决同样的问题,但仅仅让线程休眠一段时间并不能真正解决任何问题<代码>InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_0)
System.Threading.Thread.Sleep(1000)
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_0)关于@BogdanMolinger的评论有什么新闻吗?