wpf调用远程桌面

最近需要开发一个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;
        }

        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 无法改变导致,如果父窗体最大化 最小化需要实现远程链接的断开,然后重连

        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();
        }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WPF调用远程桌面并连接,可以使用System.Windows.Forms名字空间中的AxHost类以及MSTSCLib.ActiveXControl类来实现。 首先,确保项目引用了AxInterop.MSTSCLib.dll和Interop.MSTSCLib.dll这两个COM组件。然后,在XAML文件中添加一个WindowsFormsHost控件,用于承载远程桌面控件。 接下来,在代码中创建一个AxHost派生类,用于加载并承载远程桌面控件。以下是一个示例代码: ```csharp using System; using System.Windows.Forms; using System.Windows.Forms.Integration; using MSTSCLib; namespace RemoteDesktopApp { public partial class MainWindow : Window { private AxMSTSCLib.AxMsRdpClient9NotSafeForScripting rdpClient; public MainWindow() { InitializeComponent(); WindowsFormsHost host = new WindowsFormsHost(); rdpClient = new AxMSTSCLib.AxMsRdpClient9NotSafeForScripting(); host.Child = rdpClient; mainGrid.Children.Add(host); } private void ConnectButton_Click(object sender, RoutedEventArgs e) { rdpClient.Server = "RemoteDesktopServerName"; rdpClient.UserName = "Username"; rdpClient.AdvancedSettings8.ClearTextPassword = "Password"; rdpClient.Connect(); } private void DisconnectButton_Click(object sender, RoutedEventArgs e) { rdpClient.Disconnect(); } } } ``` 在上述示例中,AxMSTSCLib.AxMsRdpClient9NotSafeForScripting类是远程桌面控件的包装类。通过设置Server、UserName和ClearTextPassword属性,可以指定远程桌面服务器的名称、用户名和密码。然后,使用Connect方法连接到远程桌面服务器,使用Disconnect方法断开连接。 请注意,此示例仅展示了基本的远程桌面连接操作,实际项目中可能需要更多的配置和错误处理。 希望对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值