我試圖模擬自定義遊戲控制器應用程序的鍵盤命令。因爲我需要在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