SendInput не может правильно имитировать клавиатуру в C# ⇐ C#
-
Anonymous
SendInput не может правильно имитировать клавиатуру в C#
Я пытаюсь имитировать события мыши и клавиатуры, используя SendInput() в C#. Мышь смоделирована отлично, а симуляция клавиатуры не работает.
В этом случае я попытался использовать другой язык для подключения клавиатуры, чтобы определить, действительно ли она работает, но мне ничего не удалось подключить. Я пытался проверить, есть ли ошибки, но Marshal.GetLastWin32Error() возвращает 0, что означает отсутствие ошибки. Я тоже пробовал запускать от имени администратора, но не получилось.
После этого я обнаружил аналогичную ситуацию в StackOverflow и попытался изменить код на KeyEventFlags.KEYDOWN | KeyEventFlags.SCANCODE и KeyEventFlags.KEYDOWN | KeyEventFlags.UNICODE, но они оба не сработали.
Вот код:
[DllImport("user32.dll", SetLastError = true)] public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); KEYBDINPUT KeyboardInput = новый KEYBDINPUT(); KeyboardInput.dwFlags = (uint)(KeyEventFlags.KEYDOWN); KeyboardInput.wVk = (ushort)'A'; InputUnion объединение = новый InputUnion(); Union.ki = KeyboardInput; ВХОД[] ввод = новый ВХОД[1]; input[0].type = (uint)InputTypes.KEYBOARD; ввод[0].U = объединение; Console.WriteLine(SendInput(1, input, Marshal.SizeOf(union))); Console.WriteLine(Marshal.GetLastWin32Error()); Примечание: я только нажимаю клавишу, но она все равно должна возвращать 1 и быть подключенной, тогда как сейчас она возвращает 0.
Вот код, определяющий перечисления:
публичное перечисление InputTypes: uint { МЫШЬ = 0, КЛАВИАТУРА = 1, ОБОРУДОВАНИЕ = 2 } публичное перечисление MouseEventFlags: uint { АБСОЛЮТ = 0x8000, СЛЕВА ВНИЗ = 0x0002, СЛЕВА ВВЕРХ = 0x0004, СРЕДНИЙ = 0x0020, СРЕДНИЙ ВВЕРХ = 0x0040, ДВИЖЕНИЕ = 0x0001, ВНИЗ = 0x0008, ПРАВУП = 0x0010, КОЛЕСО = 0x0800, ХВНИЗ = 0x0080, ХУП = 0x0100, ХКОЛЕСО = 0x01000 } публичное перечисление KeyEventFlags: ushort { КНОПКА = 0x0000, РАСШИРЕННЫЙКЛЮЧ = 0x0001, КЛАВИАТУРА = 0x0002, ЮНИКОД = 0x0004, СКАНКОД = 0x0008 } [StructLayout(LayoutKind.Sequential)] публичная структура INPUT { общедоступный тип uint; общественный InputUnion U; } [StructLayout(LayoutKind.Explicit)] публичная структура InputUnion { [FieldOffset(0)] общественный MOUSEINPUT ми; [FieldOffset(0)] общедоступный KEYBDINPUT ки; [FieldOffset(0)] общественный HARDWAREINPUT привет; } [StructLayout(LayoutKind.Sequential)] общественная структура MOUSEINPUT { общественный int dx; общественный int dy; общественный uint mouseData; общественный uint dwFlags; общественное время; общественный IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] открытая структура KEYBDINPUT { публичный ушорт WVK; публичный шорт wScan; общественный uint dwFlags; общественное время; общественный IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] публичная структура HARDWAREINPUT { общественный uint uMsg; общественный ярлык wParamL; общедоступный идентификатор wParamH; } Интересно, почему это не работает и какой шаг я ошибся.
Я пытаюсь имитировать события мыши и клавиатуры, используя SendInput() в C#. Мышь смоделирована отлично, а симуляция клавиатуры не работает.
В этом случае я попытался использовать другой язык для подключения клавиатуры, чтобы определить, действительно ли она работает, но мне ничего не удалось подключить. Я пытался проверить, есть ли ошибки, но Marshal.GetLastWin32Error() возвращает 0, что означает отсутствие ошибки. Я тоже пробовал запускать от имени администратора, но не получилось.
После этого я обнаружил аналогичную ситуацию в StackOverflow и попытался изменить код на KeyEventFlags.KEYDOWN | KeyEventFlags.SCANCODE и KeyEventFlags.KEYDOWN | KeyEventFlags.UNICODE, но они оба не сработали.
Вот код:
[DllImport("user32.dll", SetLastError = true)] public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); KEYBDINPUT KeyboardInput = новый KEYBDINPUT(); KeyboardInput.dwFlags = (uint)(KeyEventFlags.KEYDOWN); KeyboardInput.wVk = (ushort)'A'; InputUnion объединение = новый InputUnion(); Union.ki = KeyboardInput; ВХОД[] ввод = новый ВХОД[1]; input[0].type = (uint)InputTypes.KEYBOARD; ввод[0].U = объединение; Console.WriteLine(SendInput(1, input, Marshal.SizeOf(union))); Console.WriteLine(Marshal.GetLastWin32Error()); Примечание: я только нажимаю клавишу, но она все равно должна возвращать 1 и быть подключенной, тогда как сейчас она возвращает 0.
Вот код, определяющий перечисления:
публичное перечисление InputTypes: uint { МЫШЬ = 0, КЛАВИАТУРА = 1, ОБОРУДОВАНИЕ = 2 } публичное перечисление MouseEventFlags: uint { АБСОЛЮТ = 0x8000, СЛЕВА ВНИЗ = 0x0002, СЛЕВА ВВЕРХ = 0x0004, СРЕДНИЙ = 0x0020, СРЕДНИЙ ВВЕРХ = 0x0040, ДВИЖЕНИЕ = 0x0001, ВНИЗ = 0x0008, ПРАВУП = 0x0010, КОЛЕСО = 0x0800, ХВНИЗ = 0x0080, ХУП = 0x0100, ХКОЛЕСО = 0x01000 } публичное перечисление KeyEventFlags: ushort { КНОПКА = 0x0000, РАСШИРЕННЫЙКЛЮЧ = 0x0001, КЛАВИАТУРА = 0x0002, ЮНИКОД = 0x0004, СКАНКОД = 0x0008 } [StructLayout(LayoutKind.Sequential)] публичная структура INPUT { общедоступный тип uint; общественный InputUnion U; } [StructLayout(LayoutKind.Explicit)] публичная структура InputUnion { [FieldOffset(0)] общественный MOUSEINPUT ми; [FieldOffset(0)] общедоступный KEYBDINPUT ки; [FieldOffset(0)] общественный HARDWAREINPUT привет; } [StructLayout(LayoutKind.Sequential)] общественная структура MOUSEINPUT { общественный int dx; общественный int dy; общественный uint mouseData; общественный uint dwFlags; общественное время; общественный IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] открытая структура KEYBDINPUT { публичный ушорт WVK; публичный шорт wScan; общественный uint dwFlags; общественное время; общественный IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] публичная структура HARDWAREINPUT { общественный uint uMsg; общественный ярлык wParamL; общедоступный идентификатор wParamH; } Интересно, почему это не работает и какой шаг я ошибся.
Мобильная версия