【发布时间】:2012-01-22 13:49:50
【问题描述】:
如何在游戏窗口中模拟按键(使用 Windows 中的任何编程语言)?
AutoHotKeys 脚本和 .NET SendKeys 函数不起作用...
【问题讨论】:
标签: windows autohotkey sendkeys
如何在游戏窗口中模拟按键(使用 Windows 中的任何编程语言)?
AutoHotKeys 脚本和 .NET SendKeys 函数不起作用...
【问题讨论】:
标签: windows autohotkey sendkeys
使用 AutoIt!3(与 AutoHotKeys 非常相似)时,您会使用 Send() (http://www.autoitscript.com/autoit3/docs/functions/Send.htm),但请确保在此之前激活游戏窗口 (WinActivate())。
我已经使用它成功地与 Second Life(它使用 OpenGL)进行交互。您可能需要在模拟按键之间有一个Sleep() 时间段,因为并非所有游戏都实现了良好的键盘缓冲区。
如果这不起作用,则游戏可能正在直接访问硬件驱动程序,您唯一的选择是挂接到键盘驱动程序。
如果游戏是异步轮询,您需要使用 down 和 up 修饰符标志:
Send("{left down}") ; hold down the LEFT key
Sleep(10) ; keep it pressed for 10 milliseconds
Send("{left up}") ; release the LEFT key
确定按住按键的时间完全取决于您尝试控制的程序轮询键盘的频率;无法确定。
【讨论】:
Send 模拟持续最微小的一秒(实际上为零秒)的按键。您可能希望对Send (autoitscript.com/autoit3/docs/appendix/SendKeys.htm) 使用 DOWN/UP 修饰符。
InputSimulator 并没有真正削减它。任何想法为什么?
任何编程语言?我的建议是用 C 或 C++ 编写一个小应用程序(尽管您也可以使用 P/Invoke 在 .NET 应用程序中执行此操作)。
具体来说,您正在寻找来自 Win32 API 的 SendInput function,它可以将低级键盘和鼠标输入发送到应用程序。它通过包含您要发送的信息的INPUT structure 来执行此操作。
当然,使用此功能受 UIPI 约束,这意味着您注入输入的应用程序必须以与进行注入的应用程序相同或更低的完整性级别运行。
然而,由于这个函数通常是 SendKeys 在幕后使用的,最后一点警告可能是它不起作用的原因。很难准确地说;你没有告诉我们你所说的“不工作”是什么意思。
【讨论】: