Tôi đang cố gắng mô phỏng các lệnh bàn phím cho một ứng dụng điều khiển trò chơi tùy chỉnh. Bởi vì tôi sẽ cần phải mô phỏng các lệnh trong môi trường DirectInput, hầu hết các phương thức thông thường đều không hoạt động. Tôi biết rằng bằng cách sử dụng một cái móc sẽ làm việc 100% nhưng tôi đang cố gắng để tìm thấy một thực hiện dễ dàng hơn.Mô phỏng Bàn phím với API SendInput trong các ứng dụng DirectInput
Tôi đã thực hiện khá nhiều tìm kiếm và thấy rằng bằng cách sử dụng API SendInput với Scancode thay vì các phím ảo sẽ hoạt động, nhưng có vẻ như hoạt động như khóa là "gắn bó". Tôi đã gửi cả hai sự kiện KEYDOWN và KEYUP nhưng khi tôi cố gửi tin nhắn trong môi trường DirectInput, trò chơi hoạt động như thể phím đang được giữ. Ví dụ, nếu tôi mô phỏng một phím "W" và có khóa được ánh xạ trong một Shooter người đầu tiên đến hành động "di chuyển về phía trước", khi tôi đang ở trong trò chơi, chức năng dưới đây sẽ khiến nhân vật di chuyển về phía trước . Tuy nhiên, chỉ bằng cách phát lệnh một lần, nó sẽ di chuyển nhân vật về phía trước vô thời hạn.
Đây là một đoạn mã (trong C#) cho hàm SendInput Tôi gọi:
[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());
}
}
Tôi không chắc chắn nếu phương pháp này là một nguyên nhân bị mất, hoặc nếu có chỉ là một cái gì đó ngớ ngẩn tôi đang mất tích. Tôi ghét làm phức tạp hơn mã của tôi nếu tôi không phải bằng cách sử dụng móc, nhưng đây cũng là lãnh thổ mới cho tôi.
Bất kỳ trợ giúp nào mà bất kỳ ai có thể cung cấp đều được đánh giá cao.
Cảm ơn!
'INPUT [] 'là gì? Đó có phải là từ ''user32.dll' '? –