您的位置:首页 > 其它

在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;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: