在VS2015下通过MFC实行对IE浏览器Internet Explorer类的控制 控制的工具CrystalDiskMark
2017-12-21 14:49
447 查看
控件ID可以在程序中查找或者自己根据ID类型定义更换
源代码可在此处下载
点击打开链接
http://download.csdn.net/download/zggzgw/10168993毕竟查资料把积分花光了,所以收了点积分为下次查资料使用
// HTMLContrlDlg.cpp : 实现文件 // #include "stdafx.h" #include "HTMLContrl.h" #include "HTMLContrlDlg.h" #include <mshtml.h> #include <oleacc.h> #include <atlbase.h> #include <COMUTIL.H> #include"myHead.h" #include<ole2.h> #pragma comment(lib,"ole32") CComModule _Module; #include<atlcom.h> #pragma comment(lib,"comsupp.lib") #ifdef _DEBUG #define new DEBUG_NEW #endif SpDoc spdoc[8]; void FindWindowsHwnd(HWND hWnd); CString strReadRate = NULL; // CHTMLContrlDlg 对话框 BEGIN_DHTML_EVENT_MAP(CHTMLContrlDlg) DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK) DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel) END_DHTML_EVENT_MAP() CHTMLContrlDlg::CHTMLContrlDlg(CWnd* pParent /*=NULL*/) : CDHtmlDialog(IDD_HTMLCONTRL_DIALOG, IDR_HTML_HTMLCONTRL_DIALOG, pParent) , m_SeqReadRate(_T("")) , testNumber(_T("1")) , csTestSize(_T("1000MB")) { m_WinThread1 = NULL; m_WinThread = NULL; m_bBtnDn = FALSE; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CHTMLContrlDlg::DoDataExchange(CDataExchange* pDX) { CDHtmlDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1_RADE, m_SeqReadRate); DDX_CBString(pDX, IDC_TESTNUMBER, testNumber); DDX_Control(pDX, IDC_TESTNUMBER, cbTestNumber); DDX_Control(pDX, IDC_TESTSIZE, cbTestSize); DDX_CBString(pDX, IDC_TESTSIZE, csTestSize); } BEGIN_MESSAGE_MAP(CHTMLContrlDlg, CDHtmlDialog) ON_BN_CLICKED(IDC_BUTTON_OPEN, &CHTMLContrlDlg::OnBnClickedButtonOpen) ON_MESSAGE(WM_MYUPDATEDATA,OnUpdateMyData) ON_MESSAGE(WM_OPENWINDOWS,OpenMyWindows) ON_BN_CLICKED(IDC_BUTTON_SELECT, &CHTMLContrlDlg::OnBnClickedButtonSelect) ON_CBN_SELCHANGE(IDC_TESTNUMBER, &CHTMLContrlDlg::OnSelchangeTestnumber) ON_CBN_SELCHANGE(IDC_TESTSIZE, &CHTMLContrlDlg::OnSelchangeTestsize) ON_WM_MOVE() ON_WM_NCLBUTTONUP() ON_WM_NCLBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_ALL, &CHTMLContrlDlg::OnBnClickedButtonAll) END_MESSAGE_MAP() // CHTMLContrlDlg 消息处理程序 BOOL CHTMLContrlDlg::OnInitDialog() { CDHtmlDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 cbTestNumber.AddString("1"); cbTestNumber.AddString("2"); cbTestNumber.AddString("3"); cbTestNumber.AddString("4"); cbTestNumber.AddString("5"); cbTestNumber.AddString("6"); cbTestNumber.AddString("7"); cbTestNumber.AddString("8"); cbTestNumber.AddString("9"); cbTestSize.AddString("50MB"); cbTestSize.AddString("100MB"); cbTestSize.AddString("500MB"); cbTestSize.AddString("1000MB"); cbTestSize.AddString("2000MB"); cbTestSize.AddString("4000MB"); return TRUE; } void CHTMLContrlDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDHtmlDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CHTMLContrlDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } HRESULT CHTMLContrlDlg::OnButtonOK(IHTMLElement* /*pElement*/) { OnOK(); return S_OK; } HRESULT CHTMLContrlDlg::OnButtonCancel(IHTMLElement* /*pElement*/) { OnCancel(); return S_OK; } DWORD RandomLeftThread(CHTMLContrlDlg *pDlg) { //自定义消息函数,实现在非对话框的线程函数里进行对话框数据的刷新 pDlg->SendMessage(WM_MYUPDATEDATA, FALSE); return 0; } LRESULT CHTMLContrlDlg::OnUpdateMyData(WPARAM Wparam, LPARAM lParam) { UpdateData(Wparam); return TRUE; } LRESULT CHTMLContrlDlg::OpenMyWindows(WPARAM Wparam, LPARAM lParam) { return TRUE; } UINT MyThreadRead(LPVOID dlg) { CHTMLContrlDlg *pDlg = (CHTMLContrlDlg*)dlg; while (true) { //RandomLeftThread(pDlg); pDlg->m_SeqReadRate = strReadRate; Sleep(2000); //RandomLeftThread(pDlg); } return TRUE; } UINT MyWindows(LPVOID dlg) { CHTMLContrlDlg *pDlg = (CHTMLContrlDlg*)dlg; pDlg->FindWindowsHwnd(); return TRUE; } BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) { /* EnumChildWindows的枚举函数 枚举找到Internet Explorer_Server的窗口的句柄 */ TCHAR szClassName[100]; ::GetClassName(hwnd, szClassName, sizeof(szClassName)); if (_tcscmp(szClassName, _T("Internet Explorer_Server")) == 0) { *(HWND*)lParam = hwnd; return FALSE; // 找到第一个 IE 控件的子窗口就停止 } else return TRUE; // 继续枚举子窗口 } void CHTMLContrlDlg::FindWindowsHwnd() { for (int i = 0; i < 8; i++) { ::EnumChildWindows(spdoc[i].ExplorerWnd, EnumChildProc, (LPARAM)&(spdoc[i].hWndChild));//通过枚举找到窗口句柄 if (NULL == (spdoc[i].hWndChild)) { MessageBox("FindWinwsHwnd error", "警告"); return; } } //UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT")); //LRESULT lRes; //::SendMessageTimeout((spdoc[i].hWndChild), nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&(lRes)); //CComPtr < IHTMLDocument2 > spDoc; // //HRESULT hr = ::ObjectFromLresult((lRes), IID_IHTMLDocument2, 0, (LPVOID *)&(spDoc)); //if (FAILED(hr)) return ; // // 程序运行到此,已经找到了 IHTMLDocument2 的接口指针 //CComBSTR bstrTitle; //spDoc->get_title(&bstrTitle);//取得文档标题 //CString str(bstrTitle); //CComPtr < IHTMLElementCollection > spElementCollection; // hr = spDoc->get_all(&spElementCollection); /*///////////////////////////////////////////////////获取读取速度 CComPtr<IHTMLElement> ele; spDoc->elementFromPoint(143, 92, &ele); BSTR eleText; BSTR eleOutText; BSTR clss; BSTR ID1; while (1) { ele->get_innerText(&eleText); strReadRate = eleText; Sleep(500); } */ } void CHTMLContrlDlg::OnBnClickedButtonOpen() { /* 打开工具按钮的实现: 通过ShellExecute函数找到本工程目录下的DiskMarkX64.exe工具,并执行打开 通过SetWindowPos排布打开工具的初始位置 通过FindWindow找到DiskMarkX64.exe工具主窗口的句柄 创建一个线程执行查找IE窗口的接口,线程执行函数MyWindows,使用线程是避免在执行循环查找的时候,对话框失去控制 */ if (m_WinThread1) { return; } //m_WinThread = AfxBeginThread(MyThreadRead, (void*)this); int temp=0; for (int i = 0; i < 8; i++) { HINSTANCE hInstance = ::ShellExecute(NULL, "open", "\.\\CrystalDiskMark_3.0.0d_azo\\DiskMarkX64.exe", NULL, NULL, SW_SHOW); Sleep(200); spdoc[i].ExplorerWnd = ::FindWindow(NULL, _T("CrystalDiskMark 3.0 x64")); if (!(spdoc[i].ExplorerWnd)) { ::MessageBox(m_hWnd, TEXT("CrystalDiskMark - Internet Explorer"), NULL, MB_OK); return; } if (i < 4) { ::SetForegroundWindow(spdoc[i].ExplorerWnd); ::SetWindowPos(spdoc[i].ExplorerWnd, HWND_TOP,pos_x + i * WIDTH, pos_y, 0, 0, SWP_NOSIZE); } else { ::SetForegroundWindow(spdoc[i].ExplorerWnd); ::SetWindowPos(spdoc[i].ExplorerWnd, HWND_TOP, pos_x + temp * WIDTH, pos_y + OFFSET_Y, 0, 0, SWP_NOSIZE); temp++; } } m_WinThread1 = AfxBeginThread(MyWindows, (void*)this); } void CHTMLContrlDlg::OnBnClickedButtonSelect() { } void CHTMLContrlDlg::OnSelchangeTestnumber() { /* 按钮1-9选择的实现 有8个窗口,所以每点击一下按钮要遍历8个窗口并发送消息 通过::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));函数注册调用::ObjectFromLresult函数 通过::SendMessageTimeout函数阻塞等待消息的注册 然后通过::ObjectFromLresult获得IE接口 */ for (int i = 0; i < 8; i++) 4000 { if ((spdoc[i].hWndChild) == NULL) { MessageBox("hWndChild为空", "警告!"); return; } CComPtr < IHTMLDocument2 > spDoc; LRESULT lRes; UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT")); ::SendMessageTimeout(spdoc[i].hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&(lRes)); HRESULT hr = ::ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (LPVOID *)&(spDoc)); if (FAILED(hr)) { return; } CComPtr < IHTMLElementCollection > spElementCollection; hr = spDoc->get_all(&spElementCollection); //获取HTML网页上的所有元素 if (FAILED(hr)) { return; } long elementLength; hr = spElementCollection->get_length(&elementLength);//计算HTML网页上的所有元素的数量 if (FAILED(hr)) { return; } VARIANT name; CComBSTR tag; name.vt = VT_I4; for (int i = 0; i < elementLength; i++) //循环找到网页上的元素,通过控件标识判别指定的元素 { name.lVal = i; IDispatch * pDispatch = NULL; HRESULT res = spElementCollection->item(name, name, &pDispatch);//通过指针遍历元素 if (FAILED(res)) { continue; } CComPtr<IHTMLSelectElement> pHtmlElement; hr = pDispatch->QueryInterface(IID_IHTMLSelectElement, (void**)&pHtmlElement);//查询是否为指定的接口,不是继续查找下一个 if (FAILED(hr)) { continue; } BSTR name; CString tempStr; long value; long selectedIndex = 2; pHtmlElement->get_name(&name); tempStr = name; int nIndex = cbTestNumber.GetCurSel(); //当前选中的项 if (tempStr.Compare("TestNumber") == 0) { pHtmlElement->get_length(&value); pHtmlElement->put_selectedIndex(nIndex);//向网页输出选定的层次 i += value; } } } } void CHTMLContrlDlg::OnSelchangeTestsize() { /* 按钮50MB-4000MB选择的实现 有8个窗口,所以每点击一下按钮要遍历8个窗口并发送消息 通过::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));函数注册调用::ObjectFromLresult函数 通过::SendMessageTimeout函数阻塞等待消息的注册 然后通过::ObjectFromLresult获得IE接口 */ for (int i = 0; i < 8; i++) { if ((spdoc[i].hWndChild) == NULL) { MessageBox("hWndChild为空", "警告!"); return; } CComPtr < IHTMLDocument2 > spDoc; LRESULT lRes; UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT")); ::SendMessageTimeout(spdoc[i].hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&(lRes)); HRESULT hr = ::ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (LPVOID *)&(spDoc)); if (FAILED(hr)) return; CComPtr < IHTMLElementCollection > spElementCollection; hr = spDoc->get_all(&spElementCollection); if (FAILED(hr)) { return; } long elementLength; hr = spElementCollection->get_length(&elementLength); if (FAILED(hr)) { return; } VARIANT name; CComBSTR tag; name.vt = VT_I4; for (int i = 0; i < elementLength; i++) { name.lVal = i; IDispatch * pDispatch = NULL; HRESULT res = spElementCollection->item(name, name, &pDispatch); if (FAILED(res)) { continue; } CComPtr<IHTMLSelectElement> pHtmlElement; hr = pDispatch->QueryInterface(IID_IHTMLSelectElement, (void**)&pHtmlElement); if (FAILED(hr)) { continue; } BSTR name; CString tempStr; long value; int nIndex = cbTestSize.GetCurSel(); //当前选中的项 pHtmlElement->get_name(&name); tempStr = name; if (tempStr.Compare("TestSize") == 0) { pHtmlElement->get_length(&value); pHtmlElement->put_selectedIndex(nIndex); i += value; } } } } void CHTMLContrlDlg::OnMove(int x, int y) { /* 通过MoveWindow函数实现,当窗口移动时,指定窗口跟随移动 */ CDHtmlDialog::OnMove(x, y); pos_x = x; pos_y = y; for (int i = 0; i < 8; i++) { if (NULL == (spdoc[i].ExplorerWnd)) return; } ::MoveWindow(spdoc[0].ExplorerWnd, x, y + 50 ,WIDTH, HEIGHT, FALSE); ::MoveWindow(spdoc[1].ExplorerWnd, x + WIDTH, y + 50, WIDTH, HEIGHT, FALSE); ::MoveWindow(spdoc[2].ExplorerWnd, x + WIDTH*2, y + 50, WIDTH, HEIGHT, FALSE); ::MoveWindow(spdoc[3].ExplorerWnd, x + WIDTH*3, y + 50, WIDTH, HEIGHT, FALSE); ::MoveWindow(spdoc[4].ExplorerWnd, x, y + 400, WIDTH, HEIGHT, FALSE); ::MoveWindow(spdoc[5].ExplorerWnd, x + WIDTH, y + 400, WIDTH, HEIGHT, FALSE); ::MoveWindow(spdoc[6].ExplorerWnd, x + WIDTH*2, y + 400, WIDTH, HEIGHT, FALSE); ::MoveWindow(spdoc[7].ExplorerWnd, x + WIDTH*3, y + 400, WIDTH, HEIGHT, FALSE); // TODO: 在此处添加消息处理程序代码 } void CHTMLContrlDlg::OnNcLButtonUp(UINT nHitTest, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDHtmlDialog::OnNcLButtonUp(nHitTest, point); } void CHTMLContrlDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDHtmlDialog::OnNcLButtonDown(nHitTest, point); } void CHTMLContrlDlg::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDHtmlDialog::OnLButtonUp(nFlags, point); } void CHTMLContrlDlg::OnDestroy() { CDHtmlDialog::OnDestroy(); /* 当控制窗口销毁时,对8个窗口进行关闭 */ for (int i = 0; i < 8; i++) { ::SendMessage(spdoc[i].ExplorerWnd, WM_CLOSE, NULL, NULL); } // TODO: 在此处添加消息处理程序代码 } void CHTMLContrlDlg::OnBnClickedButtonAll() { /* 按钮All 控制的实现 有8个窗口,所以每点击一下按钮要遍历8个窗口并发送消息 通过::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));函数注册调用::ObjectFromLresult函数 通过::SendMessageTimeout函数阻塞等待消息的注册 然后通过::ObjectFromLresult获得IE接口 */ for (int i = 0; i < 8; i++) { if ((spdoc[i].hWndChild) == NULL) { MessageBox("请先打开工具", "警告!hWndChild为空"); return; } CComPtr < IHTMLDocument2 > spDoc; LRESULT lRes; UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT")); ::SendMessageTimeout(spdoc[i].hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&(lRes)); HRESULT hr = ::ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (LPVOID *)&(spDoc)); if (FAILED(hr)) return; CComPtr<IHTMLElement> ele; BSTR eleText; spDoc->elementFromPoint(40, 41, &ele);//对指定位置上的按钮进行控制 ele->get_innerText(&eleText); strReadRate = eleText; ele->click(); } //改变按钮All的显示 CString IdName = NULL; GetDlgItemText(IDC_BUTTON_ALL, IdName); if (IdName.Compare("Stop")==0) { SetDlgItemText(IDC_BUTTON_ALL, "All"); } else { SetDlgItemText(IDC_BUTTON_ALL, "Stop"); } }
// HTMLContrlDlg.h : 头文件 // #pragma once #include "afxwin.h" #define WM_MYUPDATEDATA WM_USER+100 #define WM_OPENWINDOWS WM_USER+102 #define WIDTH 406 #define HEIGHT 368 #define OFFSET_Y 375 //Y方向的偏移 // CHTMLContrlDlg 对话框 class CHTMLContrlDlg : public CDHtmlDialog { // 构造 public: CHTMLContrlDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_HTMLCONTRL_DIALOG, IDH = IDR_HTML_HTMLCONTRL_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 HRESULT OnButtonOK(IHTMLElement *pElement); HRESULT OnButtonCancel(IHTMLElement *pElement); LRESULT OnUpdateMyData(WPARAM Wparam, LPARAM lParam); LRESULT OpenMyWindows(WPARAM Wparam, LPARAM lParam); // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() DECLARE_DHTML_EVENT_MAP() public: CString m_SeqReadRate; volatile CWinThread* m_WinThread; volatile CWinThread* m_WinThread1; public: void FindWindowsHwnd(); afx_msg void OnBnClickedButtonOpen(); afx_msg void OnBnClickedButtonSelect(); int pos_x; int pos_y; bool m_bBtnDn; CString testNumber; CComboBox cbTestNumber; CComboBox cbTestSize; CString csTestSize; afx_msg void OnSelchangeTestnumber(); afx_msg void OnSelchangeTestsize(); afx_msg void OnMove(int x, int y); afx_msg void OnNcLButtonUp(UINT nHitTest, CPoint point); afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnDestroy(); afx_msg void OnBnClickedButtonAll(); };
/* myHead.h的实现 */ #pragma once #include<afxstr.h> extern CString strReadRate; struct SpDoc { HWND hWndChild; HWND ExplorerWnd;
}
相关文章推荐
- 【初级】VS2015/MFC设置工具栏按钮提示
- AutoCAD2013 + VS2015,不可以直接在“调试”中直接启动外部程序的方式来调试,只能通过在解决方案中加入acad.exe并将acad.exe为启动项
- 如何通过组策略禁用outlook exchange add-in,控制会议室管理工具
- vs2015+opencv3.2+mfc读取摄像头显示在图片控件Picture Control
- vs2013建立MFC项目通过ODBC连接mysql数据库
- 430的VS2015单文档MFC学习笔记之创建以及添加按钮
- 1.1.3-学习Opencv与MFC混合编程之---画图工具 通过对话框进行工具的参数设置 画曲线 绘图校正
- (原创开源)CnCrypt 快速启动工具(CnCrypt磁盘加密伪装程序),VS2015编译
- VS2015 定位内存泄漏工具vld
- 【逆向工具】IDA使用1-VS2015版本debug查找Main函数,加载符号文件
- 1.1.3-学习Opencv与MFC混合编程之---画图工具 通过对话框进行工具的参数设置 画曲线 绘图校正
- VS2015 MFC显示系统时间
- VS下 MFC通过COM操作PPT
- vs2015开发工具下载
- 在VS2015中用C++创建MFC规则动态库DLL
- VS2015——MFC加载图片遇到的问题
- 502的VS2015单文档MFC学习笔记之按钮事件的相应
- JavaScript控制Crystal Report上的工具按钮的显示
- CrystalDiskMark中文版
- VS2015前端工具:NPM和Web Essentials