Я хотел бы отправить некоторые ключи через API SendInput - PullRequest
1 голос
/ 12 января 2012

Я хочу отправить некоторые ключи в игру с помощью SendInput API на C #.(Моя среда - Windows 7 64-битная)

Я написал несколько кодов следующим образом: </p> <pre><code> [DllImport("user32.dll")] static extern int SendInput(int nInputs, INPUT[] pInputs, int cbSize); [StructLayout(LayoutKind.Sequential)] private struct MOUSEINPUT { public int dx; public int dy; public uint mouseData; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] private struct KEYBDINPUT { public short wVk; public short wScan; public int dwFlags; public int time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] private struct HARDWAREINPUT { public uint uMsg; public ushort wParamL; public ushort wParamH; } [StructLayout(LayoutKind.Explicit)] private struct INPUT { [FieldOffset(0)] public uint type; [FieldOffset(4)] public MOUSEINPUT mi; [FieldOffset(4)] public KEYBDINPUT ki; [FieldOffset(4)] public HARDWAREINPUT hi; } public static void WalkFront() { INPUT[] inputs = new INPUT[1]; Keys virtualKeycode = (Keys)0x15; inputs[0].type = INPUT_KEYBOARD; inputs[0].ki.wVk = (short)virtualKeycode; inputs[0].ki.wScan = (short)MapVirtualKey((int)virtualKeycode, 0); inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE; inputs[0].ki.time = 0; inputs[0].ki.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, inputs, Marshal.SizeOf(inputs[0])); }

Однако это не работает правильно.

Видимо, этот код может отправить BackSpace в игру.На самом деле этот код может удалить символ в Notepad.exe.

Странно, этот код только отправляет BackSpace приложениям.Я изменил код ключа (я пытался 0x14, 0x13, 0x12 ... и т. Д.) В этом коде. Однако этот код отправляет только BackSpace

Я хочу отправить другой ключ (J, K, L ... и т. Д.) Приложениям, но не смог.

Любойсоветы?Спасибо

1 Ответ

3 голосов
/ 12 января 2012

Помните, что событие нажатия клавиши состоит из нажатия клавиши и после этого события нажатия клавиши. Это означает, что для «отправки возврата» необходимо дважды вызвать SendInput, один раз с нажатой клавишей, один раз с отпущенной клавишей. Если вам не удастся вызвать SendInput с отпущенным ключом, последующие нажатия клавиш, скорее всего, будут игнорироваться большинством приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...