使用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会话中工作的任何想法?
答案 0 :(得分:1)
设置扫描码,RDP或ICA会话 - 要求KEYBDINPUT.Scan为非零。 使用MapVirtualKey来获取它