C#的P / Invoke如何使用SendInput支持DirectX游戏来模拟一个按键事件 [英] C# p/Invoke How to simulate a keyPRESS event using SendInput for DirectX games
问题描述
我经常挣扎模拟各种机器人或其他自动化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屋!