SENDINPUT не изпраща натискане на клавиш към RDP

Използването на SENDINPUT за натискане на виртуални клавиши работи перфектно за моето приложение на всяко отворено поле. Страхотно, за това е :) Все пак. Наскоро беше направен доклад за грешка, че не работи в RDP сесия. Така че стартирам notepad на моя компютър, сканирам баркод (така се използва моят SENDINPUT) и низът се поставя в notepad. Започвам RDP сесия, отварям бележник и нищо не се изпраща. Бележникът остава празен. Така че по някаква странна причина SENDINPUT не минава през RDP тунела. Имам чувството, че това е по-скоро настройка в RDP сесията, но не съм толкова наивен, за да мисля, че кодът ми не може да е виновен. Кодът не е нищо особено, но ще публикувам важната част ( действително повикване до SEND INPUT)

public class User32Input
{
    public static void DoPressRawKey(byte ascii)
    {
        var inputs = PressRawKey(ascii);
        int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(INPUT));
        SendInput((uint)inputs.Count, inputs.ToArray(), size);
    }
    internal static System.Collections.Generic.List<INPUT> PressRawKey(byte ascii)
    {
        var inputs = new System.Collections.Generic.List<INPUT>();
        inputs.Add(GetRawKeyDown(ascii));
        inputs.Add(GetRawKeyUp(ascii));
        return inputs;
    }

    internal static INPUT GetRawKeyDown(byte key)
    {
        return GetRawKey(key, KEYEVENTF_KEYDN);
    }
    internal static INPUT GetRawKeyUp(byte key)
    {
        return GetRawKey(key, KEYEVENTF_KEYUP);
    }
    private static INPUT GetRawKey(byte key, uint flag)
    {
        return new INPUT
        {
            type = User32Input.INPUT_KEYBOARD,
            u = new InputUnion
            {
                ki = new KEYBDINPUT
                {
                    wVk = key,
                    wScan = 0,
                    dwFlags = flag,
                    dwExtraInfo = User32Input.GetMessageExtraInfo(),
                }
            }
        };
    }
    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

}

Някакви идеи защо не работи в RDP сесия?


person Robert Snyder    schedule 17.06.2014    source източник
comment
Вие не настройвате скан кода за едно нещо.   -  person Kevin Cook    schedule 17.06.2014
comment
интересно.. Добре, ще разгледам това. Благодаря ти   -  person Robert Snyder    schedule 17.06.2014
comment
потърсете информация в MapVirtualKey, за да я получите   -  person Kevin Cook    schedule 17.06.2014
comment
@KevinCook Разгледах, че Scancode не е зададен. MSDN казва, че указва Unicode символ, който трябва да бъде изпратен. Не изпращам Unicode (но съм мислил да направя това). Следователно трябва да се настрои на 0   -  person Robert Snyder    schedule 17.06.2014
comment
RDP или ICA сесии - изисква KEYBDINPUT.Scan да не е нула.   -  person Kevin Cook    schedule 17.06.2014
comment
Благодаря ти. Поразрових още малко и си напълно прав. Сега ще вкарам това в моя код и ще го проверя. Ако поставите htis като отговор, ще го приема   -  person Robert Snyder    schedule 17.06.2014


Отговори (1)


Задайте сканиращия код, RDP или ICA сесии - изисква KEYBDINPUT.Scan да не е нула. Използвайте MapVirtualKey, за да го получите

person Kevin Cook    schedule 17.06.2014