SENDINPUT не отправляет нажатие клавиши в RDP

Использование SENDINPUT для нажатия виртуальных клавиш идеально подходит для моего приложения на любом открытом поле. Отлично, для этого оно и предназначено :) Однако. Недавно был сделан отчет об ошибке, что он не работает в сеансе RDP. Итак, я запускаю блокнот на своем компьютере, сканирую штрих-код (именно так используется мой SENDINPUT), и строка помещается в блокнот. Я запускаю сеанс 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 Я посмотрел, не установлен ли скан-код. 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