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

📄 doceventhandler.cpp

📁 一个在IExplorer中运行
💻 CPP
字号:
// DocEventHandler.cpp : Implementation of CDocEventHandler
// Handles HTMLDocumentEvents2

#include "stdafx.h"
#include <mshtmdid.h>
#include "DocEventHandler.h"


// CDocEventHandler

//
// IDispatch Methods
//
STDMETHODIMP CDocEventHandler::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
                                         DISPPARAMS* pDispParams, VARIANT* pvarResult,
                                         EXCEPINFO*  pExcepInfo,  UINT* puArgErr)
{
	if (!pDispParams)
		return E_INVALIDARG;
	
	if (!pvarResult)
		return E_POINTER;

	switch (dispidMember)
	{
	

	case DISPID_HTMLDOCUMENTEVENTS2_ONPROPERTYCHANGE:
		//ATLTRACE(_T("HTMLDocumentEvents::onpropertychange fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE:
		//ATLTRACE(_T("HTMLDocumentEvents::onreadystatechange fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE:
		//ATLTRACE(_T("HTMLDocumentEvents::onbeforeupdate fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONAFTERUPDATE:
		//ATLTRACE(_T("HTMLDocumentEvents::onafterupdate fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONROWEXIT:
		//ATLTRACE(_T("HTMLDocumentEvents::onrowexit fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONROWENTER:
		//ATLTRACE(_T("HTMLDocumentEvents::onrowenter fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONDRAGSTART:
		//ATLTRACE(_T("HTMLDocumentEvents::ondragstart fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONSELECTSTART:
		//ATLTRACE(_T("HTMLDocumentEvents::onselectstart fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONERRORUPDATE:
		//ATLTRACE(_T("HTMLDocumentEvents::onerrorupdate fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONCONTEXTMENU:
		//ATLTRACE(_T("HTMLDocumentEvents::oncontextmenu fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONSTOP:
		//ATLTRACE(_T("HTMLDocumentEvents::onstop fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONROWSDELETE:
		//ATLTRACE(_T("HTMLDocumentEvents::onrowsdelete fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONROWSINSERTED:
		//ATLTRACE(_T("HTMLDocumentEvents::onrowsinserted fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONCELLCHANGE:
		//ATLTRACE(_T("HTMLDocumentEvents::oncellchange fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONDATASETCHANGED:
		//ATLTRACE(_T("HTMLDocumentEvents::ondatasetchanged fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONDATAAVAILABLE:
		//ATLTRACE(_T("HTMLDocumentEvents::ondataavailable fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONDATASETCOMPLETE:
		//ATLTRACE(_T("HTMLDocumentEvents::ondatasetcomplete fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREEDITFOCUS:
		//ATLTRACE(_T("HTMLDocumentEvents::onbeforeeditfocus fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONSELECTIONCHANGE:
		//ATLTRACE(_T("HTMLDocumentEvents::onselectionchange fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONCONTROLSELECT:
		//ATLTRACE(_T("HTMLDocumentEvents::oncontrolselect fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONFOCUSIN:
		//ATLTRACE(_T("HTMLDocumentEvents::onfocusin fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONFOCUSOUT:
		//ATLTRACE(_T("HTMLDocumentEvents::onfocusout fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONACTIVATE:
		//ATLTRACE(_T("HTMLDocumentEvents::onactivate fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONDEACTIVATE:
		//ATLTRACE(_T("HTMLDocumentEvents::ondeactivate fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREACTIVATE:
		//ATLTRACE(_T("HTMLDocumentEvents::onbeforeactivate fired\n"));
		
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREDEACTIVATE:
		//ATLTRACE(_T("HTMLDocumentEvents::onbeforedeactivate fired\n"));
		return DISP_E_MEMBERNOTFOUND;
	case DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEUP:
		ATLTRACE(_T("HTMLDocumentEvents::onmouseup fired\n"));
		{
			CComPtr<IDispatch> spDisp;
			spDisp = pDispParams->rgvarg[0].pdispVal;
			if (spDisp)
			{
				CComQIPtr<IHTMLEventObj, &IID_IHTMLEventObj> spEventObj(spDisp);
				if (spEventObj)
				{
					long nMouseBtn = 0;
					HRESULT hr = spEventObj->get_button(&nMouseBtn);
					if (SUCCEEDED(hr) && nMouseBtn == 0)
					{
						ATLTRACE(_T("HTMLDocumentEvents::onmousedown fired -- simulated by script\n"));
						//*m_pbUserClickedLink = FALSE;
						break;
					}
					
					CComPtr<IHTMLElement> spElem;
					hr = spEventObj->get_srcElement(&spElem);
					if (SUCCEEDED(hr) && spElem)
					{
						CComBSTR bsTagName;

						while (1)
						{
							spElem->get_tagName(&bsTagName);
							bsTagName.ToUpper();

							if (bsTagName == L"BODY")
								break;	// did not click a link

							if (bsTagName == L"A" ||
								bsTagName == L"AREA" ||
								bsTagName == L"INPUT" ||
								bsTagName == L"IMG")
							{
								ATLTRACE(_T("HTMLDocumentEvents::onclick fired -- user clicked a link\n"));								
								CComBSTR temp;
								spElem->get_outerHTML(&temp);
								if(temp == m_lastclick)
								{
									*m_ptimeClick = timeGetTime();
								}
								break;
							}

							CComPtr<IHTMLElement> spParentElem;
							hr = spElem->get_parentElement(&spParentElem);
							if (FAILED(hr) || !spParentElem)
								break;
							spElem = spParentElem;
						}
					}
				}
			}
		}
		
		return DISP_E_MEMBERNOTFOUND;
	case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK:		
		//ATLTRACE(_T("HTMLDocumentEvents::onclick fired\n"));
		return DISP_E_MEMBERNOTFOUND;

	case DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEDOWN:
		ATLTRACE(_T("HTMLDocumentEvents::onmousedown fired\n"));
		{
			CComPtr<IDispatch> spDisp;
			spDisp = pDispParams->rgvarg[0].pdispVal;
			if (spDisp)
			{
				CComQIPtr<IHTMLEventObj, &IID_IHTMLEventObj> spEventObj(spDisp);
				if (spEventObj)
				{
					long nMouseBtn = 0;
					HRESULT hr = spEventObj->get_button(&nMouseBtn);
					if (SUCCEEDED(hr) && nMouseBtn == 0)
					{
						ATLTRACE(_T("HTMLDocumentEvents::onmousedown fired -- simulated by script\n"));
						//*m_pbUserClickedLink = FALSE;
						break;
					}
					
					CComPtr<IHTMLElement> spElem;
					hr = spEventObj->get_srcElement(&spElem);
					if (SUCCEEDED(hr) && spElem)
					{
						CComBSTR bsTagName;

						while (1)
						{
							spElem->get_tagName(&bsTagName);
							bsTagName.ToUpper();
							
							
							if (bsTagName == L"BODY")
								break;	// did not click a link

							if (bsTagName == L"A" ||
								bsTagName == L"AREA" ||
								bsTagName == L"INPUT" ||
								bsTagName == L"IMG")
							{
								ATLTRACE(_T("HTMLDocumentEvents::onclick fired -- user clicked a link\n"));								
								spElem->get_outerHTML(&m_lastclick);
								*m_ptimeClick = timeGetTime();
								break;
							}

							CComPtr<IHTMLElement> spParentElem;
							hr = spElem->get_parentElement(&spParentElem);
							if (FAILED(hr) || !spParentElem)
								break;
							spElem = spParentElem;
						}
					}
				}
			}
		}
		return DISP_E_MEMBERNOTFOUND;
	case DISPID_HTMLDOCUMENTEVENTS2_ONDBLCLICK:
	case DISPID_HTMLDOCUMENTEVENTS2_ONKEYDOWN:
	case DISPID_HTMLDOCUMENTEVENTS2_ONKEYUP:
	case DISPID_HTMLDOCUMENTEVENTS2_ONKEYPRESS:
	case DISPID_HTMLDOCUMENTEVENTS2_ONHELP:
	case DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEMOVE:
	
	case DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOUT:
	case DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOVER:
	case DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEWHEEL:
		return DISP_E_MEMBERNOTFOUND;

	default:
		ATLTRACE(_T("HTMLDocumentEvents2 event %ld (0x%x) fired\n"), dispidMember, dispidMember);
		return DISP_E_MEMBERNOTFOUND;
	}
	return S_OK;
}

⌨️ 快捷键说明

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