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. JSON.parse()和JSON.stringify()(转载)

    parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...

  2. 揭开HTTP网络协议神秘面纱系列(三)

    HTTP首部字段有四种类型:通用首部字段,请求首部字段,响应首部字段,实体首部字段. 通用首部字段: 首部字段 说明 Cache-Control 控制缓存的行为 Connection 逐跳首部.连接的 ...

  3. dede channelartlist 中引用channel 并且设置当前选择类的样式,currentstyle暂时没有效果.特发求助!!!!

    在dede中需要达到当前选择了该类,样式不同的话.如果是channelartlist 的话. 可以使用下面的情况: {dede:channelartlist typeid='6' row='3' cu ...

  4. Daily Scrum 12.9

    今日完成任务: 修复了提交回答,自动消除换行符,导致文本显示混乱的BUG.解决个人信息修改界面中,问题显示顺序不对的BUG.基本完成数据库接口webservice工作.但引入的异常还未修复. 遇到困难 ...

  5. PoEdu - C++阶段班- Lesson02_C to C++

    1  原生bool类型 c++里面的bool类型才是真正原生的true和faul,比如常见的大写的"BOOL",它就不是原生的. 原生的与非原生的bool,它们的区别: 详细说下原 ...

  6. C#调用百度地图API经验分享(一)

    最近客户提了一个需求,要在网站中添加百度地图的显示,其实原来是有谷歌地图的,但由于谷歌在大陆遭到封杀,只好再给用户增加一个选择了. 下面我将自己最近整理的一些知识分享给大家. 如何使用百度地图API: ...

  7. 恢复SQLSERVER被误删除的数据(转——收藏)

    恢复SQLSERVER被误删除的数据 摘自:http://www.cnblogs.com/lyhabc/p/3683147.html 曾经想实现Log Explorer for SQL Server的 ...

  8. jquery实现div遮罩层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 关于HTML5代码总结。

    在阅读完HTML5后,自己把一些常用的代码总结了一下,自认为比较全,如果有什么错误请指出. 1.<!DOCTYPE html>声明这是一个HTML5的页面 2.<HTML lang= ...

  10. Java list的用法排序及遍历

    原文地址:http://baike.xsoftlab.net/view/208.html 1用法 ·ArrayList ·LinkedList 2排序 ·数字排序 ·中文排序 ·实体类排序 3遍历 · ...