com组件远程桌面rdp模块的调用

rdp(remote desktop protocol)是一个多通道的协议,包括客户端视音传输、文件传输和通讯端口转向等等功能,通过压缩处理的数据网络传输也是相当快。我们在windows操作系统下面,经常用到的mstsc.exe,也提供了com组件调用的接口。

可以建立一个winform的project,通过【工具箱】->【Choose Items】将com控件添加进来。

↑ 可以看到选项卡下面列了多个版本的组件,这里要提醒一下,它们是有版本功能的区别的,他们的clsid都是不一样的,而且代表着不同操作系统版本。这里的向下兼容是对操作系统版本而言,换句话说高一级的版本com控件不一定能在低一级操作系统环境正常运行。

下面从工具箱拖拉过程对于winform应该没有啥异议的地方,我们来看一下wpf如何添加组件,同上的操作,工具箱中com控件的状态是不可用的,通过project的【add reference】列,找到了一项。

↑ terminal service,有种眼熟的感觉,linux下面常用的就是terminal终端,加进来发现少了一个AxInterop.MSTSCLib.dll。解决办法很简单,在wpf project里面加一个winform窗口,让后从工具箱把控件拉过去,project就自动加上这两个接口操作文件。

下面在代码里里敲入一句xaml。

1 <WindowsFormsHost Visibility="{Binding HostVisible}" x:Name="host" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />

我们再加一个cs,来继承一下这个activex控件。WndProc句柄操作在对象初始化的时候会调用到,以及在rdp的connect等过程也会执行到,看注释是为了解决鼠标焦点异常的问题。

 1 public class MyRDP : AxMSTSCLib.AxMsRdpClient2NotSafeForScripting
 2 {
 3     public MyRDP()
 4         : base()
 5     {
 6     }
 7
 8     protected override void WndProc(ref System.Windows.Forms.Message m)
 9     {
10         // Fix for the missing focus issue on the rdp client component
11         if (m.Msg == 0x0021) // WM_MOUSEACTIVATE
12         {
13             if (!this.ContainsFocus)
14             {
15                 this.Focus();
16             }
17         }
18
19         base.WndProc(ref m);
20     }
21 }

好,在viewmodel里面看一下初始化。看了下这个rdp实现了ISupportInitialize接口,目的是为了初始化相关依赖属性,初始化顺序在BeginInit和EndInit之间完成,只要实现了这个接口,设计器自动帮你完成,在做winform的东西,不知道大家注意到form窗体下面的designer.cs。

private void InitData()
{
    this.rdp = new MyRDP();
    ((System.ComponentModel.ISupportInitialize)(rdp)).BeginInit();
    this.rdp.Name = "rdp";
    this.rdp.Enabled = true;
    this.rdp.Dock = System.Windows.Forms.DockStyle.None;
    this.rdp.Location = new System.Drawing.Point(0, 0);
    this.rdp.OnConnecting += new EventHandler(this.RDPClient_OnConnecting);
    this.rdp.OnConnected += new EventHandler(this.RDPClient_OnConnected);
    this.rdp.OnDisconnected += new AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEventHandler(this.RDPClient_OnDisconnected);
    host.Child = this.rdp;
    ((System.ComponentModel.ISupportInitialize)(rdp)).EndInit();

    this.BtnContent = "connect";

    this.MaskVisible = System.Windows.Visibility.Visible;
    this.HostVisible = System.Windows.Visibility.Collapsed;
}

下面看一下connect的部分。

 1 private void Connect()
 2 {
 3     this.rdp.Server = this.Address;
 4     this.rdp.UserName = this.Name;
 5     this.rdp.AdvancedSettings2.RDPPort = 3389;
 6     this.rdp.AdvancedSettings2.SmartSizing = true;
 7
 8     this.rdp.Width = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenWidth);
 9     this.rdp.Height = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenHeight);
10     this.rdp.DesktopWidth = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenWidth);
11     this.rdp.DesktopHeight = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenHeight);
12     this.rdp.FullScreenTitle = "this is test";
13     MSTSCLib.IMsTscNonScriptable secured = (MSTSCLib.IMsTscNonScriptable)rdp.GetOcx();
14     secured.ClearTextPassword = this.Password;
15
16     try
17     {
18         this.rdp.Connect();
19     }
20     catch
21     {
22     }
23 }

ok,咱们看一下大概的效果。

full screen的代码很easy。

1 private void ToggleFullScreen()
2 {
3     this.rdp.FullScreen = !this.rdp.FullScreen;
4 }

好了上面rdp组件大概使用过程,另外这里有个叫WindowsFormsHost的控件值得说一下,xaml里面它的作用是承载winform控件,因为它是独立的hdwnd,所以它是凌驾于xaml控件之上的,比如用scrollviewer根本包不住它,stackoverflow也有人做了相关的扩展。最新4.5 beta framework里面好像对这个空间做了相关扩展,官方文档也有介绍,具体还没有正式发布出来。

时间: 2024-11-09 00:57:04

com组件远程桌面rdp模块的调用的相关文章

ms12-20 远程桌面(RDP)3389漏洞

这是12年的漏洞了,但是还有很多系统都没打补丁,在此记录下,便于以后总结. 首先列举下受影响的系统(看看你们的系统是否在里面): Windows Server 2003 Service Pack 2 Windows Vista x64 Edition Service Pack 2 Windows Server 2003 x64 Edition Service Pack 2 Windows XP Professional x64 Edition Service Pack 2 Windows Ser

远程桌面RDP报错CredSSP encryption oracle remediatation

远程桌面报错 "CredSSP encryption oracle remediation" 由于客户端或服务器端有一方 没打补丁,导致另一方拒绝 和他建立远程桌面连接 可以通过策略或改注册表 来绕过这个报错 C:\WINDOWS\system32>REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters\ /v AllowEncryptionOracle /

飞天诚信usb-key登录windows+远程桌面

最近在尝试用智能卡做身份验证,以飞天诚信的ePass3000为例. 1.网络环境搭建: 用3台虚机+1台实体机搭一个单独的测试网段:172.16.188.x,如下: 机器名 IP 操作系统 作用 dom 172.16.188.1 win server 2008 R2/虚机 AD域服务器.AD证书服务器.IIS服务器 ter 172.16.188.10 win server 2008 R2/虚机 远程桌面服务器(也就是以前的终端服务器) win7 172.16.188.100 win7/虚机 模拟

mac下无法远程桌面连接win10的解决办法

原文链接:http://www.hangge.com/blog/cache/detail_899.html 原来在Mac OSX下远程win7系统很正常,后来把windows系统升级成了win10,再远程桌面时就一直失败,提示"远程桌面连接无法验证您希望连接的计算机的身份". 解决办法:1,先查看防火墙是否打开,是否去掉"仅允许运行使用网络级别身份验证的远程计算机-"2,如果还是不行的话.便需要开启组策略中远程桌面链接安全层:(1)开始-运行-gpedit.msc,

Win7远程桌面连接提示“您的凭据不工作”的解决方法

以前折腾过Easy Sysprep封装Ghost版本Win7镜像,也用这个镜像测试安装过几台笔记本 电脑,今天恰好要在其中一台开启远程桌面,却发现其他Win7电脑怎样都远程登录不上. Ghost封装的系统稳定性差一直广受诟病,尽管是自己亲手封装的,但还是保持怀疑,现 在思考是否因为Ghost系统带来的问题已经不重要,解决问题才是重点,于是开始摸索解 决. 为了避免和以前的凭据冲突,把Win7客户端电脑里的Windows凭据全删除了,注册表里的 远程桌面的历史记录也清空了,检查了远程桌面客户端设置

批量启用Windows客户机远程桌面

远程桌面是微软操作系统自带的远程管理工具,它可以让IT管理员在自己的电脑上远程操作,相当于将对方的键盘和鼠标延伸到了自己的机器上,管理效率大大提高. 远程桌面服务使用RDP协议,对应TCP 3389端口.默认情况下,客户机"远程桌面"是关闭的.因此我们需要手动开启. 首先我们查看一下远程桌面的默认设置,右击"这台电脑"属性 点击左侧"远程设置" 可以看到默认是关闭的.如果要开启的话,直接点"允许远程连接到此计算机",确定即可.

rdo远程桌面管理快捷键在哪里?

自用系统:Windows 7目标系统:阿里云云服务器Windows Server 2016场景:用win7自带远程工具mstsc连接成功,用iis7远程桌面管理远程工具提示如下图解决:1.先用win7自带远程工具mstsc连接到Windows Server 20162.开始-运行-gpedit.msc,进入组策略编辑器3.找到左侧边栏计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-安全项4.修改"远程(RDP)连接要求使用指定的安全层",改为启用,安全层选择R

windows server 2008 远程桌面连接数修改--无限连接

1.开启远程桌面 我的电脑 |  属性 |  远程设置  |  远程 |  进允许运行使用网络级别身份验证的远程桌面的计算机连接(更安全)(N) 2.配置每用户连接数为2个 在windows server 2008安装完成后,默认每用户远程桌面连接数为1,最大默认的每用户远程桌面会话连接数为2. 设置:控制面板 (类别选择"小图标")  |  管理工具  |   远程桌面服务  |  远程桌面会话主机配置  |  编辑设置  |  限制每个用户只能进行一个会话  |  属性  |  “

server2012 多用户远程桌面

这个服务器是客户提供的,阿里云平台的服务器.版本是windows-server2012,拿过来的时候,只有一个windows系统,啥都没有. 我们公司的数据库开发设计人员,B/S开发人员,APK开发人员,C/S服务器开发人员都要上这个平台,问题是只允许一个用户登陆,多登陆会被挤下来. 本来让公司的网管去解决下,他告诉我们,server2012不允许多用户登录,想要解决就得买微软的认证啥的,然后才能多用户登录,然后我们就去查了一下, 有好几个地方都是这样说的,那就没跑了,于是忙得就懒得管了. 最近