在VS2015下通过MFC实行对IE浏览器Internet Explorer类的控制 控制的工具CrystalDiskMark

 
控件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++)
	{
		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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值