C++调用微软actieX控件实现远程桌面实例
2017-11-01 14:41
1056 查看
工程下载: http://download.csdn.net/download/wochendaixin/10048581 点击打开链接
系统:win10;
工具:vs2017
主要的工作部分:
1. 新建MFC的activax控件工程;
一切都是默认走下去。直接编译。然后为这个自动生成的activeX控件添加一个MFC dialog对话框。
参考网址:http://blog.csdn.net/wangzhiyang925/article/details/38715605 点击打开链接
遇到问题:
(1)我使用的vs2017一直无法为插入的对话框右键添加类。总是提示defulit.js找不到。
查了很多资料没有解决【参考:https://social.msdn.microsoft.com/Forums/zh-CN/6d6f1f3a-2b14-4194-a53d-7a0c72108f8a/mfc?forum=vstudiozhchs&forum=vstudiozhchs
点击打开链接】
最后我换了一台机器就可以右键添加类。所以我也不知道这个问题怎么解决。已经为了这个问题重装了多次vs2017,连系统都重装了一次还是不行。但是你在vs2015中是可以为对话框右键添加类的。
2.在刚才新建的对话框中添加一个微软的远程桌面 activeX控件。
参考网址:http://blog.csdn.net/linlin003/article/details/52922741 点击打开链接
遇到问题:之前因为vs2017无法右键添加对话框类,所以中间换了2015,结果悲剧法发现vs2015无法为activeX控件右键添加变量。。。结果又是一顿调。最后还是解决不了。 直接放弃了,换了之前好用的的一台装了vs2017的机器。
3.写一个html文件,来调用第一步生成的activeX控件。
主要的运行流程:
html中通过classid来加载我们所建立并注册的activex控件,控件显示的是一个mfc的对话框,对话框里面加入了微软的
Microsoft RDP Client Contorl 这个ActiveX控件,远程连接之后的桌面显示在这个控件范围区中。
主要代码改动地方:
(1) hetml文件内容:
因为我想让插件的界面铺满浏览器的界面,所以有100%的语句。这只是限定了网页中显示插件的界面大小,可以替换成固定的数字。后面的classid是编译完MFC Activex控件,并且注册完毕后的ocx的ID.
(2)建立整个MFC Activex控件工程,和插入的MFC dialog对话框之间的关系 参考网址:http://blog.csdn.net/linlin003/article/details/52922741点击打开链接
我的工程中,是想让插入的dialog对话框可以读取html文件中设置的 width,heigh,然后改动这个对话框的大小。就比如在我的html中设置的大小是铺满整个浏览器界面,所以对话框读取到这个大小,然后就将自己原本的尺寸(就是你添加对话框时,自动生成了一个大小的框),改变为新的尺寸。
这两处更改就可以让对话框和所创建的active控件联系起来。反映到实际的效果就是,控件在初始的绘图时已经不再是画一个圆圈了(在 ondraw函数中被注释掉了),而是绘制了一个对话框,这个框界面大小是由html决定。
(3)框界面大小随html决定,那么,框里的控件大小也应该随之变化,不然多丑。
这一部分,我主要是参考 http://www.cnblogs.com/hikeepgoing/p/6017526.html
点击打开链接
这样就会是的我们在插入的对话框中的一些控件,按钮等等,都可随着对话框大小改变而动态变化。
(4)对话框的环境已经准备好,接下来就是在对话框中添加微软的远程控件
这里主要参考:http://blog.csdn.net/linlin003/article/details/52922741 点击打开链接
应为远程控件是放在对话框界面里的,所以必然对话框会和这个远程控件产生一些调用关系。所以;
结束l
其实整个流程很少,主要是一直都在纠结:
1.为什么vs2017无法为对话框添加类,卸载重装。。。都不好使,能装的组件都装了。。
2.为什么vs2015,可以为对话框添加类,却无法给对话框中的一个ActiveX控件右键添加变量
3.自己之前装了一个本里的vs2017却都可以实现添加类和添加变量。这是最骚的。。
系统:win10;
工具:vs2017
主要的工作部分:
1. 新建MFC的activax控件工程;
一切都是默认走下去。直接编译。然后为这个自动生成的activeX控件添加一个MFC dialog对话框。
参考网址:http://blog.csdn.net/wangzhiyang925/article/details/38715605 点击打开链接
遇到问题:
(1)我使用的vs2017一直无法为插入的对话框右键添加类。总是提示defulit.js找不到。
查了很多资料没有解决【参考:https://social.msdn.microsoft.com/Forums/zh-CN/6d6f1f3a-2b14-4194-a53d-7a0c72108f8a/mfc?forum=vstudiozhchs&forum=vstudiozhchs
点击打开链接】
最后我换了一台机器就可以右键添加类。所以我也不知道这个问题怎么解决。已经为了这个问题重装了多次vs2017,连系统都重装了一次还是不行。但是你在vs2015中是可以为对话框右键添加类的。
2.在刚才新建的对话框中添加一个微软的远程桌面 activeX控件。
参考网址:http://blog.csdn.net/linlin003/article/details/52922741 点击打开链接
遇到问题:之前因为vs2017无法右键添加对话框类,所以中间换了2015,结果悲剧法发现vs2015无法为activeX控件右键添加变量。。。结果又是一顿调。最后还是解决不了。 直接放弃了,换了之前好用的的一台装了vs2017的机器。
3.写一个html文件,来调用第一步生成的activeX控件。
主要的运行流程:
html中通过classid来加载我们所建立并注册的activex控件,控件显示的是一个mfc的对话框,对话框里面加入了微软的
Microsoft RDP Client Contorl 这个ActiveX控件,远程连接之后的桌面显示在这个控件范围区中。
主要代码改动地方:
(1) hetml文件内容:
<HTML> <HEAD> <TITLE>TestActiveX</TITLE> </HEAD> <OBJECT ID="TestMfcAtl Control" WIDTH=100% HEIGHT=100% classid="CLSID:2FB3C11A-DB50-4E62-9D82-757AD5CD8923"></OBJECT> </HTML>
因为我想让插件的界面铺满浏览器的界面,所以有100%的语句。这只是限定了网页中显示插件的界面大小,可以替换成固定的数字。后面的classid是编译完MFC Activex控件,并且注册完毕后的ocx的ID.
(2)建立整个MFC Activex控件工程,和插入的MFC dialog对话框之间的关系 参考网址:http://blog.csdn.net/linlin003/article/details/52922741点击打开链接
我的工程中,是想让插入的dialog对话框可以读取html文件中设置的 width,heigh,然后改动这个对话框的大小。就比如在我的html中设置的大小是铺满整个浏览器界面,所以对话框读取到这个大小,然后就将自己原本的尺寸(就是你添加对话框时,自动生成了一个大小的框),改变为新的尺寸。
在 MFC Activx控件工程下的 .....crl.h 文件中 #include"ViewDialog.h" class ..{ ..... //添加消息 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); }
然后在对应的 ...crl.cpp文件中 void CTestMfcAtlDebugCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& /* rcInvalid */) { if (!pdc) return; // TODO: 用您自己的绘图代码替换下面的代码。 //pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); //pdc->Ellipse(rcBounds); m_VideoDlg.MoveWindow(rcBounds, TRUE);//(the dialog's size depends on the WIDTH and HEIGHT specified in the HTML file): } int CTestMfcAtlDebugCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 AfxEnableControlContainer(); m_VideoDlg.Create(IDD_VIEW_DIALOG,this); return 0; }
这两处更改就可以让对话框和所创建的active控件联系起来。反映到实际的效果就是,控件在初始的绘图时已经不再是画一个圆圈了(在 ondraw函数中被注释掉了),而是绘制了一个对话框,这个框界面大小是由html决定。
(3)框界面大小随html决定,那么,框里的控件大小也应该随之变化,不然多丑。
这一部分,我主要是参考 http://www.cnblogs.com/hikeepgoing/p/6017526.html
点击打开链接
在插入对话框时不是有一个步骤:右键,给这个对话框添加类。 这时,右键添加类之后,生成一个ViewDialog.h和Viewdialog.cpp 在Viewdialog.h文件中: class ....{ ........ protected: CRect m_rect; void ReSize(); POINT old; ........ public: virtual BOOL OnInitDialog(); afx_msg void OnSize(UINT nType, int cx, int cy); ..... }上面的onInitdialog()函数在你插入对话框时并不是直接生成的,需要你自己去一番操作,afx_msg void OnSize()是通过类向导中的消息加入的。
在viewdialog.cpp文件中;; BOOL CViewDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 CRect rect; GetClientRect(&rect);//取客户区大小 old.x = rect.right - rect.left; old.y = rect.bottom - rect.top; return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CViewDialog::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 if (nType != SIZE_MINIMIZED) //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作 { ReSize(); } } void CViewDialog::ReSize() { float fsp[2]; POINT Newp; //获取现在对话框的大小 CRect recta; GetClientRect(&recta); //取客户区大小 Newp.x = recta.right - recta.left; Newp.y = recta.bottom - recta.top; fsp[0] = (float)Newp.x / old.x; fsp[1] = (float)Newp.y / old.y; CRect Rect; int woc; CPoint OldTLPoint, TLPoint; //左上角 CPoint OldBRPoint, BRPoint; //右下角 HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件 while (hwndChild) { woc = ::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.x*fsp[0]); TLPoint.y = long(OldTLPoint.y*fsp[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x *fsp[0]); BRPoint.y = long(OldBRPoint.y *fsp[1]); Rect.SetRect(TLPoint, BRPoint); GetDlgItem(woc)->MoveWindow(Rect, TRUE); hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT); } old = Newp; }
这样就会是的我们在插入的对话框中的一些控件,按钮等等,都可随着对话框大小改变而动态变化。
(4)对话框的环境已经准备好,接下来就是在对话框中添加微软的远程控件
这里主要参考:http://blog.csdn.net/linlin003/article/details/52922741 点击打开链接
应为远程控件是放在对话框界面里的,所以必然对话框会和这个远程控件产生一些调用关系。所以;
在viewdialog.h文件中 #include "mstscax1.h" #include"CMsRdpClientAdvancedSettings6.h" class...{ .... public: // RDP控件变量 CMstscax1 m_RDP; ... }
在viewdialog.cpp文件中: 我的对话框中保留了初始生成时的 确定和取消 按钮。所以我把 启动连接 写在了确定按钮响应函数体里,断开连接 写在了 取消按钮响应函数体里 void CViewDialog::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 //CDialogEx::OnOK(); //获取控件当前的区域大小,决定远程桌面显示的大小 CRect rectRdpTemp; GetDlgItem(IDC_MSTSCAX1)->GetWindowRect(rectRdpTemp); long RdpHeight = rectRdpTemp.Height(); long RdpWidth = rectRdpTemp.Width(); CMsRdpClientAdvancedSettings6 m_MsRdpClientAdvancedSettings(m_RDP.get_AdvancedSettings()); m_RDP.put_Server(_T("192.168.10.182"));//远程目标主机的IP m_RDP.put_UserName(_T("work"));//登陆用户名 m_RDP.put_DesktopHeight(RdpHeight); m_RDP.put_DesktopWidth(RdpWidth); m_RDP.put_ColorDepth(32); m_MsRdpClientAdvancedSettings.put_Compress(1); m_MsRdpClientAdvancedSettings.put_BitmapPeristence(1); m_MsRdpClientAdvancedSettings.put_ClearTextPassword(_T("work"));//登陆密码 m_MsRdpClientAdvancedSettings.put_singleConnectionTimeout(30);//连接时延 m_RDP.put_ConnectingText(_T("连接中..."));//连接时显示在界面的文字 m_RDP.Connect(); //GetDlgItem(IDOK)->EnableWindow(FALSE); } void CViewDialog::OnBnClickedCancel() { // TODO: 在此添加控件通知处理程序代码 //CDialogEx::OnCancel(); m_RDP.Disconnect(); }
结束l
其实整个流程很少,主要是一直都在纠结:
1.为什么vs2017无法为对话框添加类,卸载重装。。。都不好使,能装的组件都装了。。
2.为什么vs2015,可以为对话框添加类,却无法给对话框中的一个ActiveX控件右键添加变量
3.自己之前装了一个本里的vs2017却都可以实现添加类和添加变量。这是最骚的。。
相关文章推荐
- MFC调用RDP实现远程桌面共享实例
- C++实现远程桌面集群软件
- C++实例 静态成员的引入——静态数据成员的定义、调用,静态成员函数的实现、调用。
- C#调用spicec实现远程桌面
- 简单音乐播放实例的实现,Android Service AIDL 远程调用服务
- C#调用RDP,实现远程桌面共享及控制
- Socket实现远程调用实例
- python调用短信猫控件实现发短信功能实例
- 利用微软com组件mstscax.dll实现window7远程桌面功能
- 用SWIG实现C++和Lua互相调用实例
- java实现远程桌面的实例代码
- vs2010 c#调用mstscax.dll实现远程桌面连接
- rmi经典实例---远程调用简单实现方式
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- java JNI 实例 实现调用c++函数
- 用SWIG实现C++和Lua互相调用实例
- VC++利用微软mstscax.dll控件集成远程桌面
- asp.net中调用javascript函数实现多功能日期控件示例
- 利用Castle IOC实现远程调用的接口统一(上)