目前正忙着在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);
}
如果有人能够提供帮助,我将不胜感激!
亲切的问候!