Использование 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?