【问题标题】:How to simulate keyboard input in ALL applications?如何在所有应用程序中模拟键盘输入?
【发布时间】:2012-02-04 08:00:33
【问题描述】:

我正在编写一个应用程序(在 C# 中),作为它的一部分,它必须模拟一些击键并将其发送到另一个应用程序。我正在使用http://inputsimulator.codeplex.com/ 项目来模拟按键,它适用于许多应用程序,但在某些应用程序中却不能——例如 Mortal Combat 4。

我用谷歌搜索过,发现很多答案从“不可能”到“你必须使用 XXX 库”等等。这些答案让我很害怕,甚至几乎确信我无法做到那个时候,但是……

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

【问题讨论】:

  • 到目前为止,您实际上有哪些代码可以尝试......?
  • 我正在使用我上面提到的项目。最低的方法是 [DllImport("user32.dll", SetLastError = true)] internal static extern UInt32 SendInput(UInt32 numberOfInputs, InputMsg[] inputs, Int32 sizeOfInputStructure);它在许多应用程序中都能完美运行,但不是全部。 ://
  • @FenixVoltres:我对 Windows 屏幕键盘进行了逆向工程,它使用与您链接到的库相同的输入法 (SendInput)。我挂钩了所有想到的与键盘相关的函数(keybd_eventSendInputSetKeyboardState 等),唯一被调用的函数是SendInput)。尝试根据 MSDN 文档仔细检查库的代码。
  • 哇,尊重。 :) 好的,所以这确保了我这是可能的。不过,奇怪的是它不起作用。我什至会尝试三遍阅读所有关于此的文档。也许是一些不直接与键盘连接的事情,例如对焦?我没有在任何地方设置任何焦点(但它适用于某些应用程序)。
  • 一开始是想反汇编OSK,hook所有键盘相关的功能;我决定使用 API Monitor (rohitab.com/apimonitor) 监控程序执行会更容易,因为只有少数函数能够以这种方式产生输入。您应该记录上面的那些函数,以及与扫描码相关的任何函数(它们应该属于同一类别)。

标签: c# windows input keyboard simulation


【解决方案1】:

好的,我想我终于让它工作了。我使用了 Neal P 推荐的 API Monitor,它显示 OSK 调用和我的调用之间的差异很小。稍后,我尝试让我的调用线程在使用按下和释放键发送消息之间休眠一段时间,就是这样。

【讨论】:

  • 对于尝试使用 API Monitor 的任何其他人,它只会显示 INPUT 数组中的第一个数组项,即如果您将一个包含 4 个项的数组传递给 SendItem(例如 OSK 在关闭时执行此操作模拟 LWIN keydown、U keydown、U keyup、LWIN keyup)。为了能够在参数窗口中看到整个数组,请编辑安装 API Monitor 的“\API\Windows”目录中的 User32.xml 文件并更改行
  • 你是如何做到的?我试图找出同样的问题,但只是让线程休眠一段时间并不能真正解决任何问题。 InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_0);System.Threading.Thread.Sleep(1000);InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_0);
  • @BogdanMolinger 的评论有什么消息吗?
【解决方案2】:

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

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

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

【讨论】:

  • 你说得对,DirectInput 是我的痛点 (_ ! _)。我不得不暂时停止开发我的应用程序,但我肯定会在接下来的几天里检查你的库,这似乎是我一直在寻找的东西。
  • @FenixVoltres 另外,由于目前我只支持纯 C API,用户在 github 上贡献了一个 P/Invoke 的 C# 项目,你可以检查它here
【解决方案3】:

看看 MSDN 上的SendKeys

【讨论】:

  • 我试了一下,但发生了同样的情况 - SendKeys.Send(string) 有效,但并非在每个应用程序中都有效。记事本或资源管理器可以正确处理它,但我无法让它在任何全屏游戏中工作。
  • 大多数较新的在线游戏都非常努力地试图阻止人们编写“机器人”程序,因此这比将击键发送到记事本要困难一些。你仍然可以通过使用低级 Win32.dll api 调用来绕过他们的一些努力,但你要承担责任,当然这取决于你住在哪里,所以我把研究留给你来解决。
  • 好吧,如果这些方法不是我使用的,你能说一两句吗?实际上,这个项目是更广泛工作的一部分,这是我在波兰克拉科夫 AGH 科技大学的学士学位最终项目,我不想违反任何法律。 :P 顺便说一句,我认为做一个虚拟键盘(或者在我的情况下是一种新的计算机输入方法)是完全合法的?
猜你喜欢
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2020-02-13
  • 2020-06-10
  • 2012-09-21
  • 2014-05-13
相关资源
最近更新 更多