C#学习教程:使用直接输入向游戏发送击键但是我无法使用PostMessage将击键发送到游戏窗口。任何人都知道使用直接输入功能从C#向游戏发送密钥的方法。另一种方法是直接连接到DirectInputAPI-MicrosoftResearch已经提供了一个库来执行此操作:http://research.microsoft.com/en-us/projects/detours/一旦连接到API,您可以做任何你想做的事。但是,值得注意的是,在最新版本的Windows中,用于鼠标和键盘输入的DirectInput只是Win32Windows消息的包装器。DirectInput在后台生成一个线程,该线程在将窗口消息传回应用程序之前拦截窗口消息。这是Microsoft不再建议使用DirectInput的原因之一——这意味着像PostMessage这样的消息传递API应该可以正常工作。另一种方法是使用键盘驱动程序(不是SendInput())来模拟按键和鼠标事件,而不是连接到DirectX。您可以使用Oblita的Intercept键盘驱动程序(适用于Windows2000-Windows7)和C#库Intercept(包装键盘驱动程序以在C#中使用)。有了它,你可以做很酷的事情:input.MoveMouseTo(5,5);输入.MoveMouseBy(25,25);input.SendLeftClick();输入.KeyDelay=1;//请参阅下面的解释;在非游戏应用中不需要input.SendKeys(Keys.Enter);//按下然后向上按下ENTER键(这构成按键)//或者您可以使用这两行代码执行上面相同的操作input.SendKeys(Keys.Enter,KeyState.Down);线程.睡眠(1);//在游戏中使用,一定要让线程休眠,这样游戏才能捕获所有事件。滞后的游戏无法快速处理输入,因此您可能需要将其调整为多达40毫秒的延迟。在游戏之外,甚至0毫秒的延迟都可以工作(即时按键)。input.SendKeys(Keys.Enter,KeyState.Up);input.SendText("你好,我正在打字!");/*以下所有这些字符/数字/符号都有效*/input.SendText("abcdefghijklmnopqrstuvwxyz");input.SendText("1234567890");input.SendText("!@#$%^&*()");输入.SendText("[]\;',./");input.SendText("{}|:"?");由于这些击键背后的机制是键盘驱动程序,因此它几乎不受限制现在有一些方法可以通过DirectInputAPI执行此操作。实现相同效果的唯一方法是编写您自己的DirectInputCOM对象,它只包装普通的DirectInput对象。之后,您可以添加代码来模拟击键。诀窍是用您的版本替换Win32dinput.dll。然后所有游戏都会在启动时加载您的DLL。恐怕你不能用托管语言来做到这一点。您必须在本机代码中执行此操作,因为它需要相当多的低级hackery。您可以使用非托管SendInput函数。它以低于DirectInput的级别发布输入。知道要发送的关键代码非常重要。这些可能因游戏而异。如果Windows虚拟键码对游戏不起作用,可以尝试发送DIKEYBOARD常量(如DIKEYBOARD_A等),如果还是不行可以继续尝试。例如,Half-Life或Counter-Strike可以期望ASCII代码作为键码(我花了一段时间才弄清楚)为没有探针的朋友工作(Nostale):这里还有一个有用的虚拟键码列表以上是C#学习教程:使用直接输入发送击键游戏分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——[DllImport("user32.dll")]publicstaticexternIntPtrFindWindow(stringlpClassName,stringlpWindowName);[DllImport("user32.dll")]staticexternboolPostMessage(IntPtrhWnd,UInt32Msg,intwParam,intlParam);privatevoidbutton1_Click(objectsender,EventArgse){constintWM_SYSKEYDOWN=0x0104;constintVK_SPACE=0x20;IntPtrWindowToFind=FindWindow(null,"窗口名称");PostMessage(WindowToFind,WM_SYSKEYDOWN,VK_SPACE,0);侵权请点击右侧联系管理员删除。如需转载请注明出处:
