C# SENDINPUT没有';t向RDP发送击键

C# SENDINPUT没有';t向RDP发送击键,c#,rdp,virtual-keyboard,C#,Rdp,Virtual Keyboard,使用SENDINPUT按虚拟键非常适合我在任何打开字段上的应用程序。太好了,这就是它的用途:)然而。最近有一个bug报告说它在RDP会话中不起作用。所以我在我的电脑上启动记事本,扫描条形码(这是我的SENDINPUT的使用方式),然后字符串被放到记事本上。我启动了一个RDP会话,打开记事本,什么也没有发送。记事本仍然是空白的。因此,出于某种奇怪的原因,SENDINPUT没有通过RDP隧道。我觉得这更像是RDP会话中的一种设置,但我并不天真地认为我的代码不会出错。代码没有什么特别之处,但我会发布重

使用SENDINPUT按虚拟键非常适合我在任何打开字段上的应用程序。太好了,这就是它的用途:)然而。最近有一个bug报告说它在RDP会话中不起作用。所以我在我的电脑上启动记事本,扫描条形码(这是我的SENDINPUT的使用方式),然后字符串被放到记事本上。我启动了一个RDP会话,打开记事本,什么也没有发送。记事本仍然是空白的。因此,出于某种奇怪的原因,SENDINPUT没有通过RDP隧道。我觉得这更像是RDP会话中的一种设置,但我并不天真地认为我的代码不会出错。代码没有什么特别之处,但我会发布重要部分(发送输入的实际调用)

公共类User32Input
{
公共静态void DoPressRawKey(字节ascii)
{
var输入=按绘图键(ascii);
int size=System.Runtime.InteropServices.Marshal.SizeOf(typeof(INPUT));
SendInput((uint)inputs.Count,inputs.ToArray(),size);
}
内部静态System.Collections.Generic.List按RawKey(字节ascii)
{
var inputs=new System.Collections.Generic.List();
Add(GetRawKeyDown(ascii));
Add(GetRawKeyUp(ascii));
返回输入;
}
内部静态输入GetRawKeyDown(字节键)
{
返回GetRawKey(key,KEYEVENTF_KEYDN);
}
内部静态输入GetRawKeyUp(字节键)
{
返回GetRawKey(key,KEYEVENTF\u KEYUP);
}
专用静态输入GetRawKey(字节键,uint标志)
{
返回新输入
{
type=User32Input.INPUT\u键盘,
u=新输入联合
{
ki=新的键盘输入
{
wVk=键,
wScan=0,
dwFlags=flag,
dwExtraInfo=User32Input.GetMessageExtraInfo(),
}
}
};
}
[DllImport(“user32.dll”,SetLastError=true)]
私有静态外部uint SendInput(uint nInputs,INPUT[]pInputs,int cbSize);
}

关于它为什么不能在RDP会话中工作,有什么想法吗?

设置扫描代码、RDP或ICA会话-需要KEYBDINPUT.Scan为非零。
使用MapVirtualKey获取它

您没有为一件事设置扫描代码。有趣。。好的,我会调查的。感谢您查找有关MapVirtualKey的信息以获取it@KevinCook我检查了扫描码是否未设置。MSDN表示它指定了要发送的Unicode字符。我没有发送Unicode(但我已经考虑过这样做)。因此,应将其设置为0RDP或ICA会话-要求KEYBDINPUT.Scan为非零。
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);

}