0

目前正忙着在WPF C#中为 Hyper-V 托管的 VM制作一个小 RDP 客户端。这个客户端应该完全没有管理,所以只连接到它,并且能够使用机器。所以没有停止/启动/等虚拟机的选项。

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

问题是:

1)我撒谎了,有一个功能应该是可能的:发送 Ctrl + Alt + Del。我当然在客户端上为此做了一个按钮。我尝试了几种可能性,但每一种都失败了,我什至无法向虚拟机发送一个“A”。

我尝试过的可能性:

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

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

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


b) 使用输入管理器

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 ) 时,出现了一个重大问题。当您在第一次显示机器B的 RDP 控件内单击一次时,整个应用程序就会卡住。解开它的唯一方法是,例如在机器B上单击 Windows 开始键,然后返回客户端工具,一切正常,但这是相当不可接受的。

我发现控件存在焦点问题,但以下无法解决此问题(创建了将 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);
}

如果有人能够提供帮助,我将不胜感激!

亲切的问候!

4

1 回答 1

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);
         }
于 2013-04-19T05:41:27.060 回答