我试图模拟自定义游戏控制器应用程序的键盘命令。因为我需要在DirectInput环境中模拟命令,所以大多数通常的方法都不起作用。我知道使用钩子可以工作100%,但我试图找到一个更容易的实现。在DirectInput应用程序中使用SendInput API模拟键盘
我已经做了相当多的搜索,发现通过使用SendInput API与Scancodes而不是虚拟键应该可以工作,但它似乎表现得像键是“粘住”。我已经发送了KEYDOWN和KEYUP事件,但是当我尝试在DirectInput环境中发送消息时,游戏的行为就好像按住了键。例如,如果我模拟一个“W”按键并将该键映射到第一人称射击游戏中的“向前移动”动作,则一旦我在游戏中,下面的功能将导致角色向前移动。然而,只要发布一次命令,它就会无限期地向前移动角色。
下面是SendInput功能我打电话代码段(在C#):
[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
public static void Test_KeyDown()
{
INPUT[] InputData = new INPUT[2];
Key ScanCode = Microsoft.DirectX.DirectInput.Key.W;
InputData[0].type = 1; //INPUT_KEYBOARD
InputData[0].wScan = (ushort)ScanCode;
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
InputData[1].type = 1; //INPUT_KEYBOARD
InputData[1].wScan = (ushort)ScanCode;
InputData[1].dwFlags = (uint)(SendInputFlags.KEYEVENTF_KEYUP | SendInputFlags.KEYEVENTF_UNICODE);
// send keydown
if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
{
System.Diagnostics.Debug.WriteLine("SendInput failed with code: " +
Marshal.GetLastWin32Error().ToString());
}
}
我不知道这方法是一个失败的事业,或者如果有只是一些无聊的我我错过了。如果我不需要使用钩子,我不想使代码复杂化,但这对我来说也是一个新的领域。
任何人都可以给的帮助是非常感谢。
谢谢!
什么是'INPUT []'?是否应该来自''user32.dll“? – 2015-10-23 18:00:04