目前正忙于为Hyper-V托管的VM在 WPF C#中创建一个小型RDP客户端。该客户端应该没有任何管理,因此只能连接到它,并能够使用该机器。所以没有停止/启动/等VM的选项。
使用控件:AxMSTSCLib.AxMsRdpClient7NotSafeForScripting在运行时初始化并放在WindowsFormsHost中
1)我说谎,有一个功能应该是可能的:发送Ctrl + Alt + Del。我当然在客户端上为此创建了一个按钮。我已经尝试了几种可能性但是我在每一种方法中都失败了,我甚至无法向VM发送一个“A”。
我尝试过的可能性:
a)通过user32.dll的SendInput本机调用进行键盘模拟
因此,除非我做错了没有触发键,否则此方法失败
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);
}
如果有人能帮忙解决这个问题,我一定会很感激!
亲切的问候!
答案 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);
}