C#的P / Invoke如何使用SendInput支持DirectX游戏来模拟一个按键事件 [英] C# p/Invoke How to simulate a keyPRESS event using SendInput for DirectX games

查看:350
本文介绍了C#的P / Invoke如何使用SendInput支持DirectX游戏来模拟一个按键事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我经常挣扎模拟各种机器人或其他自动化GUI程序的键盘按下事件



我已经成功地模拟使用的keydown事件:

 输入[] = kInput新的输入[1]; 
kInput [J] .TYPE = SendInputEventType.InputKeyboard;
kInput [J] .mkhi.ki.wVk = 0;
kInput [J] .mkhi.ki.wScan =(USHORT)MapVirtualKey((UINT)Keys.D5,0);
kInput [J] .mkhi.ki.dwFlags = KeyboardEventFlags.SCANCODE;
kInput [J] .mkhi.ki.time = 0;
kInput [J] .mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1,kInput,Marshal.SizeOf(typeof运算(输入)));

 输入[] = kInput新的输入[1]; 
kInput [1] = .TYPE SendInputEventType.InputKeyboard;
kInput [1] .mkhi.ki.wVk ='5';
kInput [1] .mkhi.ki.wScan = 0;
kInput [1] .mkhi.ki.dwFlags = 0;
kInput [1] .mkhi.ki.time = 0;
kInput [1] .mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1,kInput,Marshal.SizeOf(typeof运算(输入)));



<$ P $:使用



和KeyUp事件p> kInput [1] = .TYPE SendInputEventType.InputKeyboard;
kInput [1] .mkhi.ki.wVk = 0;
kInput [1] .mkhi.ki.wScan =(USHORT)MapVirtualKey((UINT)Keys.D5,0);
kInput [1] .mkhi.ki.dwFlags = KeyboardEventFlags.KEYUP;
kInput [1] .mkhi.ki.time = 0;
kInput [1] .mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1,kInput,Marshal.SizeOf(typeof运算(输入)));

  kInput [1] = .TYPE SendInputEventType.InputKeyboard; 
kInput [1] .mkhi.ki.wVk ='5';
kInput [1] .mkhi.ki.wScan = 0;
kInput [1] .mkhi.ki.dwFlags = KeyboardEventFlags.KEYUP;
kInput [1] .mkhi.ki.time = 0;
kInput [1] .mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1,kInput,Marshal.SizeOf(typeof运算(输入)));



尽管我尝试两种为结合:

  //键,
输入kInput =新的输入[2];
kInput [0] = .TYPE SendInputEventType.InputKeyboard;
kInput [0] .mkhi.ki.wVk = 0;
kInput [0] .mkhi.ki.wScan =(USHORT)MapVirtualKey((UINT)Keys.D5,0);
kInput [0] = .mkhi.ki.dwFlags KeyboardEventFlags.SCANCODE;
kInput [0] .mkhi.ki.time = 0;
kInput [0] = .mkhi.ki.dwExtraInfo IntPtr.Zero;

//重点高达
kInput [1] = .TYPE SendInputEventType.InputKeyboard;
kInput [1] .mkhi.ki.wVk = 0;
kInput [1] .mkhi.ki.wScan =(USHORT)MapVirtualKey((UINT)Keys.D5,0);
kInput [1] .mkhi.ki.dwFlags = KeyboardEventFlags.KEYUP;
kInput [1] .mkhi.ki.time = 0;
kInput [1] .mkhi.ki.dwExtraInfo = IntPtr.Zero;

// sendinput
SendInput(1,kInput,Marshal.SizeOf(typeof运算(INPUT)));



曾经有过不同程度的成功,我从来没有真正能够仿真一键保持/新闻事件,其中的支持DirectX(或其他3D)游戏会看到我的投入完全不一样的人带物理键盘会...



如何将之一,采用SendInput,模拟通过支持DirectX游戏中看到的按键/保持事件?


解决方案

要模拟键盘事件在DirectX游戏中,你需要包装的键盘驱动程序。我有同样的问题,也不这个方法(SendInput,SendKeys类)并不能帮助我。尝试使用此包装,对我来说这是成功的。


I've often struggled with simulating keyboard press events for various bots, or other GUI automating programs.

I've managed to simulate keydown events using:

INPUT[] kInput = new INPUT[1];
kInput[j].type = SendInputEventType.InputKeyboard;
kInput[j].mkhi.ki.wVk = 0;
kInput[j].mkhi.ki.wScan = (ushort) MapVirtualKey((uint) Keys.D5, 0);
kInput[j].mkhi.ki.dwFlags = KeyboardEventFlags.SCANCODE;
kInput[j].mkhi.ki.time = 0;
kInput[j].mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1, kInput, Marshal.SizeOf(typeof(INPUT)));

OR

INPUT[] kInput = new INPUT[1];
kInput[1].type = SendInputEventType.InputKeyboard;
kInput[1].mkhi.ki.wVk = '5';
kInput[1].mkhi.ki.wScan = 0;
kInput[1].mkhi.ki.dwFlags = 0;
kInput[1].mkhi.ki.time = 0;
kInput[1].mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1, kInput, Marshal.SizeOf(typeof(INPUT)));

and keyup events using:

kInput[1].type = SendInputEventType.InputKeyboard;
kInput[1].mkhi.ki.wVk = 0;
kInput[1].mkhi.ki.wScan = (ushort)MapVirtualKey((uint)Keys.D5, 0);
kInput[1].mkhi.ki.dwFlags = KeyboardEventFlags.KEYUP;
kInput[1].mkhi.ki.time = 0;
kInput[1].mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1, kInput, Marshal.SizeOf(typeof(INPUT)));

OR

kInput[1].type = SendInputEventType.InputKeyboard;
kInput[1].mkhi.ki.wVk = '5';
kInput[1].mkhi.ki.wScan = 0;
kInput[1].mkhi.ki.dwFlags = KeyboardEventFlags.KEYUP;
kInput[1].mkhi.ki.time = 0;
kInput[1].mkhi.ki.dwExtraInfo = IntPtr.Zero;
SendInput(1, kInput, Marshal.SizeOf(typeof(INPUT)));

And while my attempts to combine the two as:

//key down
INPUT kInput = new INPUT[2];
kInput[0].type = SendInputEventType.InputKeyboard;
kInput[0].mkhi.ki.wVk = 0;
kInput[0].mkhi.ki.wScan = (ushort) MapVirtualKey((uint) Keys.D5, 0);
kInput[0].mkhi.ki.dwFlags = KeyboardEventFlags.SCANCODE;
kInput[0].mkhi.ki.time = 0;
kInput[0].mkhi.ki.dwExtraInfo = IntPtr.Zero;

//Key Up
kInput[1].type = SendInputEventType.InputKeyboard;
kInput[1].mkhi.ki.wVk = 0;
kInput[1].mkhi.ki.wScan = (ushort)MapVirtualKey((uint)Keys.D5, 0);
kInput[1].mkhi.ki.dwFlags = KeyboardEventFlags.KEYUP;
kInput[1].mkhi.ki.time = 0;
kInput[1].mkhi.ki.dwExtraInfo = IntPtr.Zero;

//sendinput
SendInput(1, kInput, Marshal.SizeOf(typeof(INPUT)));

Have had varying degrees of success, I was never actually capable of emulating a key hold/press event where a DirectX (or other 3d) game would see my input in quite the way a human with a physical keyboard would...

How would one, using SendInput, emulate a key press/hold event as seen by a DirectX game?

解决方案

To simulate keyboard events in directX games you need wrapper for a keyboard driver. I had the same issue, and neither of this methods (SendInput, SendKeys class) doesn't help me. Try to use this wrapper, to me it was successfully.

这篇关于C#的P / Invoke如何使用SendInput支持DirectX游戏来模拟一个按键事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆