📄 surfhelper.cpp
字号:
// 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 + -