Próbuję symulować polecenia klawiatury dla niestandardowej aplikacji kontrolera gier. Ponieważ będę musiał symulować polecenia w środowisku DirectInput większość zwykłych metod nie działa. Wiem, że używanie haka działa w 100%, ale staram się znaleźć łatwiejszą implementację.Symulowanie klawiatury za pomocą interfejsu SendInput API w aplikacjach DirectInput
Zrobiłem sporo wyszukiwania i okazało się, że przy użyciu API SendInput z Scancodes zamiast wirtualnych kluczy powinno działać, ale wydaje się, że zachowuje się tak, jak klucz jest "sticking". Wysłałem zarówno zdarzenia KEYDOWN, jak i KEYUP, ale kiedy próbuję wysłać wiadomość w środowisku DirectInput, gra zachowuje się tak, jakby klawisz był przytrzymywany.
Na przykład, jeśli zasymuluję naciśnięcie klawisza "W" i przypisuję ten klucz do gracza "Pierwszego człowieka" do akcji "przesuń się do przodu", to po wejściu w grę funkcja poniżej spowoduje, że postać ruszy do przodu . Jednakże, wydając komendę tylko raz, przesunie ona znak do przodu w nieskończoność.
Oto fragment kodu (C#) dla funkcji SendInput Dzwonię:
[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());
}
}
Nie jestem pewien, czy ta metoda jest przegrana, lub jeśli nie jest po prostu coś mi głupio "brakuje. Nienawidzę nadmiernego komplikowania mojego kodu, jeśli nie muszę, używając haków, ale jest to również nowe terytorium dla mnie.
Każda pomoc, którą każdy może dać, jest bardzo ceniona.
Dzięki!
Co to jest "INPUT []"? Czy to miało pochodzić z '" user32.dll "'? –