2017-01-16 8 views
0

Я пытаюсь имитировать ввод клавиатуры в определенный процесс с помощью C#. Ввод символов и цифр работает нормально, но когда я пытаюсь имитировать символ «специальный символ» (ENTER, TAB и т. Д.), Ничего не происходит.Проблема с имитацией ввода клавиатуры в процесс

Что заставляет меня думать, что имитация этих специальных символов отлично работает на других процессах, таких как Skype.

Любые идеи о том, что может вызвать это странное взаимодействие? Я открыт для того, чтобы пробовать что-то на других языках, так как я не получил этого в моем проекте.

Я пробовал использовать SendInput() и PostMessage(), и оба они имеют одинаковый результат, ввод символов символов, но не специальные клавиши.

ответ

0

Мне это удалось. Я отправлю свое решение в случае, если кто-то случайно наткнется на этот пост с той же проблемой, что и я.

Решение на самом деле довольно простое. Если вы вместо отправки виртуальных кодов посылаете коды сканирования клавиатуры, все работает нормально. Вот краткий пример.

using System.Runtime.InteropServices; 
... 
    public static void PressEnter() 
    { 
     INPUT input = new INPUT(); 
     input.type = (int)InputType.INPUT_KEYBOARD; 
     input.ki.wScan = 0x1C; 
     input.ki.dwFlags = (int)KEYEVENTF.SCANCODE; 
     input.ki.dwExtraInfo = GetMessageExtraInfo(); 

     var arrayToSend = new INPUT[] { input }; 

     SendInput(1, arrayToSend, Marshal.SizeOf(input)); //Send KeyDown 
     arrayToSend[0].ki.dwFlags = (int)KEYEVENTF.SCANCODE | (int)KEYEVENTF.KEYUP; 
     SendInput(1, arrayToSend, Marshal.SizeOf(input)); //Send KeyUp 
    } 

Другая необходимая информация:

[StructLayout(LayoutKind.Explicit)] 
    public struct INPUT 
    { 
     [FieldOffset(4)] 
     public HARDWAREINPUT hi; 
     [FieldOffset(4)] 
     public KEYBDINPUT ki; 
     [FieldOffset(4)] 
     public MOUSEINPUT mi; 
     [FieldOffset(0)] 
     public int type; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct HARDWAREINPUT 
    { 
     public int uMsg; 
     public short wParamL; 
     public short wParamH; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct MOUSEINPUT 
    { 
     public int dx; 
     public int dy; 
     public int mouseData; 
     public int dwFlags; 
     public int time; 
     public IntPtr dwExtraInfo; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct KEYBDINPUT 
    { 
     public short wVk; 
     public short wScan; 
     public int dwFlags; 
     public int time; 
     public IntPtr dwExtraInfo; 
    } 

    [Flags] 
    public enum InputType 
    { 
     INPUT_MOUSE = 0, 
     INPUT_KEYBOARD = 1, 
     INPUT_HARDWARE = 2 
    } 

    [Flags] 
    public enum KEYEVENTF 
    { 
     KEYDOWN = 0, 
     EXTENDEDKEY = 0x0001, 
     KEYUP = 0x0002, 
     UNICODE = 0x0004, 
     SCANCODE = 0x0008, 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    public static extern IntPtr GetMessageExtraInfo(); 
    [DllImport("user32.dll", SetLastError = true)] 
    public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);