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