2014-11-28 2 views
0

Я могу отправить специальные клавиши на локальном компьютере, но то же самое не работает на удаленной машине. Я ссылался на многие статьи, но не смог найти код для отправки специальных ключей для подключения к удаленному рабочему столу. Пожалуйста, помогите по этому поводу. Ниже приведен код.Отправить специальные клавиши по удаленному рабочему столу

static void Main(string[] args) 
    { 
     Thread.Sleep(3000); 
     //char[] keyboardStrokes = { (char)Keys.LWin, (char)Keys.R }; 
     char[] keyboardStrokes = { (char)Keys.LMenu, (char)Keys.F4 }; 
     SendData(keyboardStrokes); 

    } 
    struct INPUT 
    { 
     public INPUTType type; 
     public INPUTUnion Event; 
    } 

    [StructLayout(LayoutKind.Explicit)] 
    struct INPUTUnion 
    { 
     [FieldOffset(0)] 
     internal MOUSEINPUT mi; 
     [FieldOffset(0)] 
     internal KEYBDINPUT ki; 
     [FieldOffset(0)] 
     internal HARDWAREINPUT hi; 
    } 

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

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

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

    enum INPUTType : uint 
    { 
     INPUT_KEYBOARD = 1 
    } 

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

    [DllImport("user32.dll", SetLastError = true)] 
    static extern UInt32 SendInput(int numberOfInputs, INPUT[] inputs, int sizeOfInputStructure); 

    [DllImport("user32.dll")] 
    static extern IntPtr GetMessageExtraInfo(); 

    private static void SendData(char[] c) 
    { 
     ProcessKey(c); 
    } 


    private static void ProcessKey(char[] key) 
    { 
     // create input events as unicode with first down, then up 
     INPUT[] inputs = new INPUT[key.Length + 1]; 
     for (int i = 0; i < key.Length; i++) 
     { 
      inputs[i].type = INPUTType.INPUT_KEYBOARD; 
      inputs[i].Event.ki.dwFlags = KEYEVENTF.UNICODE; 
      inputs[i].Event.ki.wScan = (short)key[i]; 
      inputs[i].Event.ki.wVk = (short)key[i]; 
     } 
     //Thread.Sleep(3000); 
     inputs[key.Length].type = INPUTType.INPUT_KEYBOARD; 
     inputs[key.Length].Event.ki.dwFlags = KEYEVENTF.KEYUP; 
     inputs[key.Length].Event.ki.dwExtraInfo = GetMessageExtraInfo(); 
     // inputs[key.Length].Event.ki.wScan = 
     // inputs[key.Length].Event.ki.dwFlags |= KEYEVENTF.KEYUP; 
     uint cSuccess = SendInput(inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT))); 
     if (cSuccess != inputs.Length) 
     { 
      throw new Win32Exception(); 
     } 
    } 

Заранее спасибо.

ответ

0

Наконец-то я могу отправить большую часть специальных клавиш на удаленный компьютер, используя следующий код. Единственная проблема заключается в том, что после завершения операции специальные клавиши остаются нажатыми. пожалуйста, дайте мне знать, как выпустить специальные клавиши.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Thread.Sleep(3000); 
     int[] keyboardStrokes = { (int)Keys.LMenu, (int)Keys.Tab, (int)Keys.Tab }; 
     ProcessKey(keyboardStrokes); 
     Console.Read(); 
    } 
    struct INPUT 
    { 
     public INPUTType type; 
     public INPUTUnion Event; 
    } 

    [StructLayout(LayoutKind.Explicit)] 
    struct INPUTUnion 
    { 
     [FieldOffset(0)] 
     internal MOUSEINPUT mi; 
     [FieldOffset(0)] 
     internal KEYBDINPUT ki; 
     [FieldOffset(0)] 
     internal HARDWAREINPUT hi; 
    } 

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

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

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

    enum INPUTType : uint 
    { 
     INPUT_KEYBOARD = 1 
    } 

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

    [DllImport("user32.dll", SetLastError = true)] 
    static extern UInt32 SendInput(int numberOfInputs, INPUT[] inputs, int sizeOfInputStructure); 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    internal static extern uint MapVirtualKey(uint uCode, uint uMapType); 

    private static void ProcessKey(int[] key) 
    { 
     INPUT[] inputs = new INPUT[key.Length + 1]; 
     for (int i = 0; i < key.Length; i++) 
     { 
      uint skey = MapVirtualKey((uint)key[i], (uint)0x0); 
      inputs[i].type = INPUTType.INPUT_KEYBOARD; 
      inputs[i].Event.ki.dwFlags = KEYEVENTF.SCANCODE; 
      inputs[i].Event.ki.wScan = (ushort)skey; 
     } 
     inputs[key.Length].type = INPUTType.INPUT_KEYBOARD; 
     inputs[key.Length].Event.ki.dwFlags = KEYEVENTF.UNICODE; 
     inputs[key.Length].Event.ki.dwFlags |= KEYEVENTF.KEYUP; 
     uint cSuccess = SendInput(inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT))); 
    } 

} 
Смежные вопросы