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。

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

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

 public class MyRDP : AxMSTSCLib.AxMsRdpClient2NotSafeForScripting
{
public MyRDP()
: base()
{
} 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) // WM_MOUSEACTIVATE
{
if (!this.ContainsFocus)
{
this.Focus();
}
} base.WndProc(ref m);
}
}

好,在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(, );
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的部分。

 private void Connect()
{
this.rdp.Server = this.Address;
this.rdp.UserName = this.Name;
this.rdp.AdvancedSettings2.RDPPort = ;
this.rdp.AdvancedSettings2.SmartSizing = true; this.rdp.Width = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenWidth);
this.rdp.Height = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenHeight);
this.rdp.DesktopWidth = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenWidth);
this.rdp.DesktopHeight = Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenHeight);
this.rdp.FullScreenTitle = "this is test";
MSTSCLib.IMsTscNonScriptable secured = (MSTSCLib.IMsTscNonScriptable)rdp.GetOcx();
secured.ClearTextPassword = this.Password; try
{
this.rdp.Connect();
}
catch
{
}
}

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

full screen的代码很easy。

 private void ToggleFullScreen()
{
this.rdp.FullScreen = !this.rdp.FullScreen;
}

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

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

  1. windows修改远程桌面RDP连接数

    windows 2003在默认情况下最多只允许两个用户进行远程终端连接,当达到两个远程桌面连接的到时候,再有人尝试连接,就会提示已经达到最大终端数,无法连上了. 一.windows2003终端连接数修 ...

  2. PowerShell自定义修改远程桌面RDP端口

    应朋友的要求写了一个通过PowerShell修改远程桌面(Remote Desktop)端口的脚本,不复杂,启动脚本后有两个选项:1.自定义远程桌面:2.回复远程桌面的默认端口3389 发出来给有用的 ...

  3. PCB 一键远程桌面+RDP文件生成

    最近在写个内网INCAM内网授权工具中,在服务端监听客户端请求后,后台自动处理客户端请求并远程客户端 这里记录3个点. 一.运行RDP文件后,正常会有下图2个弹窗,怎么可以关闭这2个弹窗呢, 通过模拟 ...

  4. 关于KeePass实现mstsc远程桌面(rdp协议)的自动登录

    本文的Keepass版本:KeePass Password Safe Version 2.45 首先介绍一下Keepass,引用官网的解释如下: KeePass is a free open sour ...

  5. 远程桌面RDP不能粘贴文本

    刚才用远程桌面 登陆 服务器,突然发现不能在本机和远程服务器之间粘贴文本了,即不能从本机复制文本粘贴到服务器,也不能从服务器复制文本粘贴到本机. 在服务器上打开任务管理器,查看进程,有 rdpclip ...

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

    最近在尝试用智能卡做身份验证,以飞天诚信的ePass3000为例. 1.网络环境搭建: 用3台虚机+1台实体机搭一个单独的测试网段:172.16.188.x,如下: 机器名 IP 操作系统 作用 do ...

  7. 远程桌面连接 [Content] 出现身份验证错误。 要求的函数不受支持

    [Window Title] 远程桌面连接 [Content] 出现身份验证错误. 要求的函数不受支持 以上是我远程得时候报的错.   下面直接上  最NB得解决方案.不管用直接在下面评论 通过管理控 ...

  8. 详细故障排除步骤:针对 Azure 中到 Windows VM 的远程桌面连接问题

    本文提供详细的故障排除步骤,用于为基于 Windows 的 Azure 虚拟机诊断和修复复杂的远程桌面错误. Important 若要消除更常见的远程桌面错误,请务必先阅读远程桌面的基本故障排除文章, ...

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

    原文链接:http://www.hangge.com/blog/cache/detail_899.html 原来在Mac OSX下远程win7系统很正常,后来把windows系统升级成了win10,再 ...

随机推荐

  1. ViewPager图片轮转带点的

    布局页面设置: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:and ...

  2. Cisco SG300系列交换机划分VLan与普通路由器连接配置

    思科SG300系列三层交换机是针对中小企业设计的一款产品,Marvell 主控和128M Ram,最大支持52个千兆RJ45端口和2个SFP端口,因公司业务需求,最近也进行了解和配置,具体型号为 SG ...

  3. ubuntu初次安装后设置root用户密码

    在ubuntu系统下,为了安全起见,在安装过程中,系统屏蔽了用户设置root用户. 设置方法如下: 登录普通用户 打开终端 sudo passwd[sudo] password for [userna ...

  4. Ubuntu14.04环境下Samba报错排错过程

    排错的方法和思路非常重要,日志非常非常非常非常重要!!! 搭建好Samba之后,windos访问一直下面这个错误,然后傻逼一样一直百度百度,一弄又是几天,但是经过自己一步一步的排错,弄成功之后,那心情 ...

  5. JAVA学习<三>

    1.Java中运算符的优先级: 2.条件语句If: 如果 if 条件成立时的执行语句只有一条,是可以省略大括号滴!但如果执行语句有多条,那么大括号就是不可或缺的. public class Hello ...

  6. hdu 2202 最大三角形 (凸包)

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. CSS3样式问题

    empty-cells 属性设置是否显示表格中的空单元格 tr:nth-child(even)偶数行的表格 li:nth-child(20)指定位置 2016-09-2813:23:45

  8. linux下查找某文件关键字

    -e表示罗列出与关键字有关的行,“ABC”表示查找的关键字,/XXX/4.assoc.linear表示该路径下的文件 .assoc.linear

  9. PHP--字符串处理函数

    字符串的声明 1. 2. 3. [注]单引号与双引号声明字符串的区别: 1.strlen():获取字符串长度 2.substr():截取字符串 3.strpos():查找字符串在指定字符串中的位置 4 ...

  10. 小甲鱼python视频第九讲(课后习题)

    1.列表里可以存放什么东西? 可以存放任何的数据类型, list1 = ['我爱你','i love you',1314] print(list1) 2.向列表中添加元素 append(将参数作为一个 ...