⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 surfhelper.cpp

📁 一个管理ie的软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SurfHelper.cpp : Implementation of CSurfHelper
#include "stdafx.h"
#include "SHBHO.h"
#include "SurfHelper.h"

BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam);

/////////////////////////////////////////////////////////////////////////////
// CSurfHelper

BOOL CSurfHelper::ManageConnection(BOOL bAdvise)
{
	if (!m_pWebBrowser2)
		return S_OK;

	HRESULT hr;

	CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> 
		pCPContainer(m_pWebBrowser2);

	if (pCPContainer)
	{
		CComPtr<IConnectionPoint> pConnectionPoint;

		hr = pCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, 
												&pConnectionPoint);
		if (SUCCEEDED(hr))
		{
			if (bAdvise)
			{
				// Advise the client site of our desire to be handle events
				hr = pConnectionPoint->Advise((IDispatch*)this, &m_dwCookie);
				if (FAILED(hr))
				{
					dbgPrintf("%s: Failed to Advise\r\n", APP_NAME);
				}
			}
			else
			{
				// Remove us from the list of people interested...
				hr = pConnectionPoint->Unadvise(m_dwCookie);
				if (FAILED(hr))
				{
					dbgPrintf("%s: Failed to Unadvise\r\n", APP_NAME);
				}
			}
		}
	}

	return (SUCCEEDED(hr));
}

/////////////////////////////////////////////////////////////////////////////
// IOleObjectWithSite Methods
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSurfHelper::SetSite(IUnknown *pUnkSite)
{
	if (pUnkSite)
	{
		// Query pUnkSite for the IWebBrowser2 interface.
		m_pWebBrowser2 = pUnkSite;

		if (m_pWebBrowser2)
		{
			// Get settings
			HRESULT hr;
			SURFHELPLib::ISurfManagerPtr pSurfManager = NULL;
			hr = pSurfManager.CreateInstance(__uuidof(SURFHELPLib::SurfManager));
			if (FAILED(hr))
			{
				dbgPrintf("%s: Create instance of SurfManager failed!\r\n", APP_NAME);
			}
			else
			{
				try
				{
					m_dwSettings = (DWORD)pSurfManager->GetSettings();
					if (m_dwSettings & REMOVE_POPUP_BY_SIZE)
					{
						m_lWindowSizeThreshold = pSurfManager->GetWindowSizeThreshold();
					}
				}
				catch(_com_error &e)
				{
					dbgPrintf("%s: Get settings failed! %s\r\n", APP_NAME, 
						(LPCTSTR)e.Description());
				}
			}

			// Connect to the browser in order to handle events.
			ManageConnection(TRUE);
		}
	}

	return S_OK;
}

/////////////////////////////////////////////////////////////////////////////
// IDispatch Methods
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSurfHelper::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, 
								 WORD wFlags, DISPPARAMS* pDispParams, 
								 VARIANT* pvarResult, EXCEPINFO*  pExcepInfo,
								 UINT* puArgErr)
{
	HRESULT hr;
	CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pWebBrowser2;
	CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDocument;
	CComQIPtr<IHTMLScriptElement> pScriptElement;
	CComQIPtr<IHTMLElement> pElement;
	CComPtr<IHTMLElementCollection> pElementCollection;
	SURFHELPLib::ISurfManagerPtr pSurfManager = NULL;
	IDispatch *pDisp = NULL;
	VARIANT varName;
	VARIANT varIndex;
	VARIANT varValue;
	BSTR bstrValue = NULL;
	VARIANT_BOOL bTopContainer;
	wchar_t* pBuffer = NULL;
	long lWidth;
	long lHeight;
	long lObjectCount;
	long i;
	BOOL bKill;
	BOOL bChanged;

	if (!pDispParams)
		return E_INVALIDARG;

	switch (dispidMember)
	{
	case DISPID_BEFORENAVIGATE2:
		pWebBrowser2 = pDispParams->rgvarg[6].pdispVal;
		if (pWebBrowser2)
		{
			hr = pWebBrowser2->get_TopLevelContainer(&bTopContainer);
			if (bTopContainer)
			{
				//
				//remove popup by window size
				//
				if (m_dwSettings & REMOVE_POPUP_BY_SIZE)
				{
					pWebBrowser2->get_Width(&lWidth);
					pWebBrowser2->get_Height(&lHeight);
					if (lWidth * lHeight < m_lWindowSizeThreshold)
					{
						//get title and url
						hr = pWebBrowser2->get_Document(&pDisp);
						if (SUCCEEDED(hr) && pDisp)
						{
							pDocument = pDisp;
							pDisp->Release();
							if (pDocument)
							{
								pDocument->get_title(&bstrValue);
							}
						}

						//check is title or url in exlusions
						try
						{
							hr = pSurfManager.CreateInstance(__uuidof(SURFHELPLib::SurfManager));
							bKill = pSurfManager->CheckSize(bstrValue, 
								pDispParams->rgvarg[5].pvarVal->bstrVal, 
								lWidth, lHeight);
							if (bKill)
							{
								pWebBrowser2->Quit();
								break;
							}
						}
						catch(_com_error &e)
						{
							dbgPrintf("%s: Check size failed! %s\r\n", APP_NAME, 
								(LPCTSTR)e.Description());
						}

						if (bstrValue)
						{
							SysFreeString(bstrValue);
						}
					}
				}

				//
				//remove popup by url
				//
				if (pDispParams->rgvarg[5].pvarVal->vt == VT_BSTR &&
					m_dwSettings & REMOVE_POPUP_BY_URL)
				{
					hr = pWebBrowser2->get_Document(&pDisp);
					if (SUCCEEDED(hr) && pDisp)
					{
						pDocument = pDisp;
						pDisp->Release();
						if (pDocument)
						{
							pDocument->get_title(&bstrValue);
						}
					}

					try
					{
						hr = pSurfManager.CreateInstance(__uuidof(SURFHELPLib::SurfManager));
						bKill = pSurfManager->CheckUrl(bstrValue,
							pDispParams->rgvarg[5].pvarVal->bstrVal);
						if (bKill)
						{
							m_pWebBrowser2->Quit();
						}
					}
					catch(_com_error &e)
					{
						dbgPrintf("%s: Check URL failed! %s\r\n", APP_NAME, 
							(LPCTSTR)e.Description());
					}

					if (bstrValue)
					{
						SysFreeString(bstrValue);
					}
				}

				//
				// set window property
				//

				//get height before change property
				HWND hWnd;
				long lClientHeightOld;
				long lClientHeightNew;
				long lHeightNew;
				long lTop;
				RECT rectWorkArea;
				VARIANT_BOOL bOldStatus;
				int lOldStatus;
				
				bChanged = FALSE;

				pWebBrowser2->get_HWND((long*)&hWnd);
				pWebBrowser2->get_Height(&lHeight);
				pWebBrowser2->get_Top(&lTop);
				GetClientHeight(hWnd, &lClientHeightOld);

				//set window property
				pWebBrowser2->get_ToolBar(&lOldStatus);
				if (lOldStatus == 0 && m_dwSettings & SHOW_TOOL_BAR)
				{
					pWebBrowser2->put_ToolBar(TRUE);
					bChanged = TRUE;
				}

				pWebBrowser2->get_MenuBar(&bOldStatus);
				if (bOldStatus == VARIANT_FALSE && m_dwSettings & SHOW_MENU_BAR)
				{
					pWebBrowser2->put_MenuBar(TRUE);
					bChanged = TRUE;
				}

				pWebBrowser2->get_AddressBar(&bOldStatus);
				if (bOldStatus == VARIANT_FALSE && m_dwSettings & SHOW_ADDRESS_BAR)
				{
					pWebBrowser2->put_AddressBar(TRUE);
					bChanged = TRUE;
				}

				pWebBrowser2->get_StatusBar(&bOldStatus);
				if (bOldStatus == VARIANT_FALSE && m_dwSettings & SHOW_STATUS_BAR)
				{
					pWebBrowser2->put_StatusBar(TRUE);
					bChanged = TRUE;
				}

				if (m_dwSettings & SHOW_RESIZABLE)
				{
					pWebBrowser2->put_Resizable(TRUE);
				}
				
				//change window height
				if (bChanged)
				{
					pWebBrowser2->put_Visible(TRUE);
					GetClientHeight(hWnd, &lClientHeightNew);
					if (lClientHeightOld > lClientHeightNew)
					{
						lHeightNew = lHeight + lClientHeightOld - lClientHeightNew;
						SystemParametersInfo(SPI_GETWORKAREA, 0, &rectWorkArea, 0);
						if (lHeightNew > rectWorkArea.bottom - rectWorkArea.top)
						{
							lHeightNew = rectWorkArea.bottom - rectWorkArea.top;
						}
						if (lTop + lHeightNew > rectWorkArea.bottom)
						{
							lTop -= lTop + lHeightNew - rectWorkArea.bottom;
							pWebBrowser2->put_Top(lTop);
						}
						pWebBrowser2->put_Height(lHeightNew);
					}
				}
			}
		}
		break;

//	case DISPID_NAVIGATECOMPLETE2:
	case DISPID_DOCUMENTCOMPLETE:
		pWebBrowser2 = pDispParams->rgvarg[1].pdispVal;
		if (pWebBrowser2)
		{
			//
			//web page filter
			//
			hr = pWebBrowser2->get_Document(&pDisp);
			if (SUCCEEDED(hr) && pDisp)
			{
				pDocument = pDisp;
				pDisp->Release();
				if (pDocument)
				{
					//check html
					if (m_dwSettings & REMOVE_ONCONTEXTMENU ||
						m_dwSettings & REMOVE_FLASH)
					{
						hr = pDocument->get_body(&pElement);
						if (SUCCEEDED(hr) && pElement)
						{
							pElement->get_innerHTML(&bstrValue);
							if (SysStringLen(bstrValue) > 0)
							{
								bChanged = FALSE;

								try
								{
									//remove context menu disablers
									if (m_dwSettings & REMOVE_ONCONTEXTMENU)
									{
										varValue.vt = VT_NULL;
										pElement->setAttribute(
											L"oncontextmenu", varValue, 0);

										if (RandomReplaceString(
											bstrValue, L"oncontextmenu", TRUE, TRUE))
										{
											bChanged = TRUE;
										}
									}

									//remove flash
									if (m_dwSettings & REMOVE_FLASH)
									{
										if (RemoveFlash(bstrValue))
										{
											bChanged = TRUE;
										}
									}
								}
								catch (...)
								{
								}

								//remove onunload command
								if (m_dwSettings & REMOVE_ONUNLOAD)
								{
									varValue.vt = VT_NULL;
									pElement->setAttribute(
										L"onunload", varValue, 0);
								}

								if (bChanged)
								{
									hr = pElement->put_innerHTML(bstrValue);
								}
								SysFreeString(bstrValue);
							}
							pElement.Release();
						}
					}

					//check script
					hr = pDocument->get_scripts(&pElementCollection);
					if (SUCCEEDED(hr) && pElementCollection)
					{
						VariantInit(&varIndex);
						varName.vt = VT_I4;

						pElementCollection->get_length(&lObjectCount);
						for (i=0; i<lObjectCount; i++)
						{
							varName.lVal = i;
							hr = pElementCollection->item(varName, varIndex, 
															&pDisp);
							if (FAILED(hr) || !pDisp)
							{
								continue;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -