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。
<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模块的调用的更多相关文章
- windows修改远程桌面RDP连接数
windows 2003在默认情况下最多只允许两个用户进行远程终端连接,当达到两个远程桌面连接的到时候,再有人尝试连接,就会提示已经达到最大终端数,无法连上了. 一.windows2003终端连接数修 ...
- PowerShell自定义修改远程桌面RDP端口
应朋友的要求写了一个通过PowerShell修改远程桌面(Remote Desktop)端口的脚本,不复杂,启动脚本后有两个选项:1.自定义远程桌面:2.回复远程桌面的默认端口3389 发出来给有用的 ...
- PCB 一键远程桌面+RDP文件生成
最近在写个内网INCAM内网授权工具中,在服务端监听客户端请求后,后台自动处理客户端请求并远程客户端 这里记录3个点. 一.运行RDP文件后,正常会有下图2个弹窗,怎么可以关闭这2个弹窗呢, 通过模拟 ...
- 关于KeePass实现mstsc远程桌面(rdp协议)的自动登录
本文的Keepass版本:KeePass Password Safe Version 2.45 首先介绍一下Keepass,引用官网的解释如下: KeePass is a free open sour ...
- 远程桌面RDP不能粘贴文本
刚才用远程桌面 登陆 服务器,突然发现不能在本机和远程服务器之间粘贴文本了,即不能从本机复制文本粘贴到服务器,也不能从服务器复制文本粘贴到本机. 在服务器上打开任务管理器,查看进程,有 rdpclip ...
- 飞天诚信usb-key登录windows+远程桌面
最近在尝试用智能卡做身份验证,以飞天诚信的ePass3000为例. 1.网络环境搭建: 用3台虚机+1台实体机搭一个单独的测试网段:172.16.188.x,如下: 机器名 IP 操作系统 作用 do ...
- 远程桌面连接 [Content] 出现身份验证错误。 要求的函数不受支持
[Window Title] 远程桌面连接 [Content] 出现身份验证错误. 要求的函数不受支持 以上是我远程得时候报的错. 下面直接上 最NB得解决方案.不管用直接在下面评论 通过管理控 ...
- 详细故障排除步骤:针对 Azure 中到 Windows VM 的远程桌面连接问题
本文提供详细的故障排除步骤,用于为基于 Windows 的 Azure 虚拟机诊断和修复复杂的远程桌面错误. Important 若要消除更常见的远程桌面错误,请务必先阅读远程桌面的基本故障排除文章, ...
- mac下无法远程桌面连接win10的解决办法
原文链接:http://www.hangge.com/blog/cache/detail_899.html 原来在Mac OSX下远程win7系统很正常,后来把windows系统升级成了win10,再 ...
随机推荐
- 常用JS汇总
01. 取文档url参数值 function getQueryString(name) { var reg = new RegExp("(^|&)" + name + &q ...
- lucene query
在lucene的搜索中,最重要的无疑就是对query的理解和掌握了.这里扒拉一下源码(版本3.5.0)的query和query实现: query是一个抽象类,实现类有以下几个: termQuery m ...
- Android 操作SQLite基本用法
一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的 ...
- java核心知识点学习----重点学习线程池ThreadPool
线程池是多线程学习中需要重点掌握的. 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好的提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考 ...
- hdu 4006 The kth great number (优先队列)
/********************************************************** 题目: The kth great number(HDU 4006) 链接: h ...
- 查看lock
select a.session_id,a.oracle_username, a.os_user_name, b.owner "OBJECT OWNER", b.object_na ...
- 【随笔】vmstat性能监测
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.相比top,vmstat可以看到整个机 ...
- javascript 封装分页
最近自己做了一个后台,想把分页通过js给封装起来 于是乎就有了下面的代码 此代码,算是一个半成品,还需完善,思路还是可以借鉴的 page方法传入3个参数 1.total总条数 2.page当前页码 3 ...
- [转]Caffe 深度学习框架上手教程
Caffe 深度学习框架上手教程 机器学习Caffe caffe 原文地址:http://suanfazu.com/t/caffe/281 blink 15年1月 6 Caffe448是一个清 ...
- python学习之路-day3
本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数 ==================================== 一.集合操作 集合是一个无序的,不重复的数据组合,它的主要 ...