最近需要开发一个WPF 调用远程桌面的功能,网上找了一些资料+自己测试。发现有一些坑,这里记录一下。避免以后遇到同类问题。
1.控件选择
主要利用的是微软的自带的远程桌面连接控件,我尝试的是 AxMsRdpClient8 和AxMsRdpClient8NotSafeForScripting这两个控件。
经过尝试,AxMsRdpClient8 在连接win10的电脑是正常,连接win7连不上。 后面就放弃了。选择了
AxMsRdpClient8NotSafeForScripting
但是这两个控件,都是在Form下的,所以我们需要用WindowsFormsHost来承载。
首先。需要添加com组件。添加步骤
然后选选择需要导出的组件
(在这里导入的时候,遇到提示工具箱未激活的问题,因为我们当前建的是wpf的程序,所以工具箱需要在form窗体中才能找到。)
2.dll引用
这个时候需要引用dll。主要是2个dll
AxInterop.MSTSCLib.dll
Interop.MSTSCLib.dll
网上下载下来这两个dll,引用正常,但是启动程序会报 未能加载程序集什么什么的。 这个是因为dll没有考到debug目录下。需要手动拷贝过去。
不过这里我建议用我的方式。
(新建一个Form窗体。手动拖入新加的com组件。dll就自动引用过去了)
然后不用这个form页面就可以删除它。
3.测试连接在这里插入代码片
在主界面下添加
private AxMsRdpClient8NotSafeForScripting RDP { get; set; }
public ServerConfigInfo FSWConfigData { get; set; }
public FSWWindow(ServerConfigInfo data)
{
InitializeComponent();
FSWConfigData = data;
RDP = new AxMsRdpClient8NotSafeForScripting();
RDP.BeginInit();
host1.Child = RDP;
this.SizeChanged += FSWWindow_SizeChanged;
this.Loaded += FSWWindow_Loaded;
this.Closing += FSWWindow_Closing;
}
连文章来源:https://www.toymoban.com/news/detail-441668.html
private void FSWWindow_Loaded(object sender, RoutedEventArgs e)
{
if (RDP.Connected != 0)
{
return;
}
Connect();
}
public void Connect()
{
if (RDP.Connected != 0)
{
return;
}
RDP.Dock = System.Windows.Forms.DockStyle.None;
RDP.Server = FSWConfigData.FSWServerIP;
RDP.UserName = FSWConfigData.FSWUserName;
RDP.AdvancedSettings8.ClearTextPassword = FSWConfigData.FSWPassWord;
//RDP.AdvancedSettings8.AuthenticationLevel = 2;
RDP.AdvancedSettings8.EnableCredSspSupport = true;
//RDP.AdvancedSettings8.NegotiateSecurityLayer = false;
RDP.FullScreen = true;
//RDP.AdvancedSettings8.RelativeMouseMode = true;
//RDP.AdvancedSettings.BitmapPeristence = 1;
//RDP.AdvancedSettings.Compress = 1;
//RDP.AdvancedSettings8.SmartSizing = true;
//RDP.ColorDepth = 15;
//RDP.AdvancedSettings8.RedirectDrives = false;
//RDP.AdvancedSettings8.RedirectPrinters = false;
//RDP.AdvancedSettings8.RedirectClipboard = true;
//RDP.AdvancedSettings8.RedirectSmartCards = false;
RDP.OnConnecting += Rdp_OnConnecting;
RDP.OnDisconnected += Rdp_OnDisconnected;
RDP.OnFatalError += Rdp_OnFatalError;
RDP.OnLogonError += Rdp_OnLogonError;
RDP.Connect();
}
坑点2,需要注意的是,连接成功后,如果改变父级窗体最大化 最小化,远程链接的桌面大小无法改变,这是因为DesktopWidth和DesktopHeight 无法改变导致,如果父窗体最大化 最小化需要实现远程链接的断开,然后重连文章来源地址https://www.toymoban.com/news/detail-441668.html
private void reDraw(AxMSTSCLib.AxMsRdpClient8NotSafeForScripting rdp,int width,int height)//重新調整rdp桌面大小,需要重新連線才能實現
{
if (rdp.Connected == 1)//
{
rdp.Disconnect();
while (rdp.Connected != 0)//如果尚未斷開連線則等待,直至完全斷開
{
Thread.Sleep(100);
DoEvents();
}
}
rdp.Width = width - 50;
rdp.Height = height - 50;
rdp.DesktopWidth = width;
rdp.DesktopHeight = height;
if (rdp.Server != "")
rdp.Connect();
}
到了这里,关于wpf调用远程桌面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!