Estoy tratando de simular comandos de teclado para una aplicación de control de juego personalizada. Como tendré que simular comandos en un entorno DirectInput, la mayoría de los métodos habituales no funcionan. Sé que usar un gancho funcionaría al 100%, pero estoy tratando de encontrar una implementación más fácil.Teclado simulando con SendInput API en aplicaciones DirectInput
Realicé bastante búsqueda y descubrí que al usar la API SendInput con códigos de escaneo en lugar de las teclas virtuales debería funcionar, pero parece que se comporta como si las claves estuvieran "pegadas". Envié los eventos KEYDOWN y KEYUP, pero cuando intento enviar el mensaje en un entorno DirectInput, el juego actúa como si la tecla se mantuviera presionada.
Por ejemplo, si simulo una pulsación de tecla "W" y hago que la tecla se asigne a un jugador en primera persona para la acción "avanzar", una vez que estoy en el juego, la función siguiente hará que el personaje avance . Sin embargo, solo emitiendo el comando una vez, moverá al personaje hacia adelante indefinidamente.
Aquí es un fragmento de código (en C#) para la función SendInput estoy llamando:
[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());
}
}
No estoy seguro de si este método es una causa perdida, o si hay algo que tonta estoy perdido Odio complicar demasiado mi código si no tengo que usar ganchos, pero este es también un territorio nuevo para mí.
Cualquier ayuda que alguien pueda dar es muy apreciada.
Gracias!
¿Qué es 'INPUT []'? ¿Se suponía que provenía de '" user32.dll "'? –