来自MSTSCLib的C#WPF RDP ax控制用于Hyper-V问题

时间:2013-01-25 14:31:02

标签: c# wpf activex rdp mstsc

目前正忙于为Hyper-V托管的VM在 WPF C#中创建一个小型RDP客户端。该客户端应该没有任何管理,因此只能连接到它,并能够使用该机器。所以没有停止/启动/等VM的选项。

使用控件:AxMSTSCLib.AxMsRdpClient7NotSafeForScripting在运行时初始化并放在WindowsFormsHost中

问题是:

1)我说谎,有一个功能应该是可能的:发送Ctrl + Alt + Del。我当然在客户端上为此创建了一个按钮。我已经尝试了几种可能性但是我在每一种方法中都失败了,我甚至无法向VM发送一个“A”。

我尝试过的可能性:

a)通过user32.dll的SendInput本机调用进行键盘模拟

  • 当我执行SendKeystroke'控制,alt和其他'时,然后转到VM,例如按下F,触发了控制+ F命令。或者我可以开始选择多个文件(比如班次)。
  • 除此之外,我尝试在控件的高级设置/安全设置上打开和关闭一些属性

因此,除非我做错了没有触发键,否则此方法失败


b)使用InputManager

PresentationSource source = PresentationSource.FromVisual(this);
KeyEventArgs insertStuff = new KeyEventArgs(Keyboard.PrimaryDevice, source, 0, Key.D0);
insertStuff.RoutedEvent = UIElement.KeyDownEvent;
InputManager.Current.ProcessInput(insertStuff);

这是windowsformhost所在的用户控件,我尝试用this.winformshost替换它,但是没有运气


c)尝试了另一种方式,但失败了,忘记了,无论如何都不是很漂亮。


2)第二个问题是焦点,更确切地说:在VM中启动应用程序时进行关注。

我会详细解释: 在开发者机器上没有错。但是,当我使用我的工具将RDP内的应用程序启动到虚拟机( A )以连接到另一台虚拟机( B )时,存在一个主要问题。当您第一次在RDP控件内单击一次机器 B 时,整个应用程序都会卡住。解开它的唯一方法就是点击Windows启动键,例如在机器上 B 然后再回到客户端工具,一切正常,但这是不可接受的。

我发现控件存在焦点问题,但是以下失败来解决此问题(创建了具有ax控件作为基类的新类):

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    //Fix for the missing focus issue on the rdp client component
    if (m.Msg == 0x0021)
    {
        this.Focus();
    }
    base.WndProc(ref m);
}

如果有人能帮忙解决这个问题,我一定会很感激!

亲切的问候!

1 个答案:

答案 0 :(得分:1)

 protected override void WndProc(ref Message m)
         {
             switch (m.Msg)
             {
                 case 0x021:
                     {
                         Message mm = new Message();
                         mm.Msg = 0x007;
                         base.WndProc(ref mm);
                     }
                     break;
             }
             base.WndProc(ref m);
         }