【问题标题】:How can I send keyboard input to a OpenGL/DirectX game window?如何将键盘输入发送到 OpenGL/DirectX 游戏窗口?
【发布时间】:2012-01-22 13:49:50
【问题描述】:

如何在游戏窗口中模拟按键(使用 Windows 中的任何编程语言)?

AutoHotKeys 脚本和 .NET SendKeys 函数不起作用...

【问题讨论】:

    标签: windows autohotkey sendkeys


    【解决方案1】:

    使用 AutoIt!3(与 AutoHotKeys 非常相似)时,您会使用 Send() (http://www.autoitscript.com/autoit3/docs/functions/Send.htm),但请确保在此之前激活游戏窗口 (WinActivate())。

    我已经使用它成功地与 Second Life(它使用 OpenGL)进行交互。您可能需要在模拟按键之间有一个Sleep() 时间段,因为并非所有游戏都实现了良好的键盘缓冲区。

    如果这不起作用,则游戏可能正在直接访问硬件驱动程序,您唯一的选择是挂接到键盘驱动程序。

    如果游戏是异步轮询,您需要使用 downup 修饰符标志:

    Send("{left down}")  ; hold down the LEFT key
    Sleep(10)            ; keep it pressed for 10 milliseconds
    Send("{left up}")    ; release the LEFT key
    

    确定按住按键的时间完全取决于您尝试控制的程序轮询键盘的频率;无法确定。

    【讨论】:

    • 使用 AutoIt3,它几乎可以工作,但如果我直接发送命令,例如“{LEFT}”。它不是由游戏处理的。我必须在循环中重复 SEND("{LEFT}") 十次,即使在这种情况下,有时游戏也无法处理该命令。
    • 可能发生的是游戏正在异步轮询 {LEFT} 信号;即它检查是否在特定时刻按下了键。 Send 模拟持续最微小的一秒(实际上为零秒)的按键。您可能希望对Send (autoitscript.com/autoit3/docs/appendix/SendKeys.htm) 使用 DOWN/UP 修饰符。
    • 现在,我可以通过编程方式控制游戏了,谢谢! :-)
    • @Martijn,我已经尝试过您提出的解决方案,但它对我不起作用。我也在尝试将输入发送到不同的应用程序,但既不使用 autoIT 功能,也不使用InputSimulator 并没有真正削减它。任何想法为什么?
    【解决方案2】:

    任何编程语言?我的建议是用 C 或 C++ 编写一个小应用程序(尽管您也可以使用 P/Invoke 在 .NET 应用程序中执行此操作)。

    具体来说,您正在寻找来自 Win32 API 的 SendInput function,它可以将低级键盘和鼠标输入发送到应用程序。它通过包含您要发送的信息的INPUT structure 来执行此操作。

    当然,使用此功能受 UIPI 约束,这意味着您注入输入的应用程序必须以与进行注入的应用程序相同或更低的完整性级别运行。

    然而,由于这个函数通常是 SendKeys 在幕后使用的,最后一点警告可能是它不起作用的原因。很难准确地说;你没有告诉我们你所说的“不工作”是什么意思。

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2012-03-03
      • 2019-03-21
      • 2014-05-08
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多