Отправить специальные ключи через удаленный рабочий стол

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

 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();
        }
    }

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


person Parveen Kumar    schedule 28.11.2014    source источник


Ответы (1)


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

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)));
    }

}
person Parveen Kumar    schedule 03.12.2014
comment
Ваш код неверен. Вы должны использовать ОДИН SendKey() с нажатой клавишей, затем паузу не менее 10 мс, а затем ДРУГОЙ SendKey() с нажатой клавишей. И все это внутри вашего цикла for() для каждого ключа. - person Elmue; 23.04.2020