bho里怎么写 u盘里出现mydocumentt.attachevent

BHO (Browser Helper Objects)
BHO (Browser Helper Objects)
BHO is basically a DLL which is connected to the Internet Explorer (and possibly to Explorer as well).
In terms of COM, a BHO is only required to implement .
Internet Explorer uses this interface'as method #A(SetSite,/library/en-us/com/oin_e2o_9ckl.asp?frame=true).";
A Base Class for a BHO
The header file
Here is a class definition that can be used as a start point when implementing a BHO.
#pragma once
#include &ocidl.h&
#include &exdisp.h&
class BHO class adpbho : public IObjectWithSite, public IDispatch
adpbho(unsigned long cookie) : m(1), webBrowser_(0), connectionPointContainer(0), cookie_(cookie), document_(0) {};
~adpbho() {
webBrowser_-&Release(); connectionPointContainer-&Release();
if (document_) document_-&Release();
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE QueryInterface(
REFIID iid, //Identifier of the requested interface
void ** ppvObject //Address of output variable that receives the //interface pointer requested in iid
HRESULT STDMETHODCALLTYPE GetSite(
REFIID riid,
void** ppvSite
HRESULT STDMETHODCALLTYPE SetSite(IUnknown*);
// --------- methods from IDispatch
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo);
HRESULT STDMETHODCALLTYPE GetTypeInfo(
unsigned int
ITypeInfo FAR* FAR*
HRESULT STDMETHODCALLTYPE GetIDsOfNames(
OLECHAR FAR* FAR*
rgszNames,
unsigned int
DISPID FAR*
HRESULT STDMETHODCALLTYPE adpbho::Invoke(
dispIdMember,
DISPPARAMS FAR*
pDispParams,
VARIANT FAR*
pVarResult,
EXCEPINFO FAR*
pExcepInfo,
unsigned int FAR*
IWebBrowser2*
webBrowser_;
IConnectionPointContainer* connectionPointC
unsigned long
IDispatch*
document_;
And its implementation file
#include "adpbho.h"
//#include "ExtieFactory.h"
#include "Exdisp.h"
#include "Exdispid.h"
#include "mshtml.h"
#include "mshtmdid.h"
#include "olectl.h"
#include &stdio.h&
ULONG STDMETHODCALLTYPE adpbho::AddRef() {
char buf[50];
sprintf(buf, "adpbho Add Ref: %d", m);
ULONG STDMETHODCALLTYPE adpbho::Release() {
if (--m != 0 ) {
MB1("deleting adpbho");
HRESULT STDMETHODCALLTYPE adpbho::QueryInterface(
REFIID riid, //Identifier of the requested interface
void ** ppvObject //Address of output variable that receives the
//interface pointer requested in iid
MB1("adpbho: QueryInterface");
adpbho: neither IID_IUnknown nor clsid_extie, {34A715A0--924A-0020AFC7AC4D}
DIID_DWebBrowserEvents2
adpbho: neither IID_IUnknown nor clsid_extie, {49C3DE7C-D329-11D0-AB73-00C04FC33E80}
if ( riid == IID_IUnknown ) {
*ppvObject = static_cast&adpbho*& (this);
else if (riid == IID_IObjectWithSite) {
// ::MessageBox(0, "Querying for IID_IObjectWithSite", 0, 0);
*ppvObject = static_cast&IObjectWithSite*&(this);
//::MessageBox(0,"XXXXXXXXXXXXXXXXXXXX", 0, 0);
//char buf[50];
//sprintf(buf, "%x", ppvObject
//static_cast&IObjectWithSite*&(*ppvObject)-&SetSite(0);
else if (riid == IID_IDispatch) {
// ::MessageBox(0, "Querying for IID_IDispatch", 0, 0);
*ppvObject = static_cast&IDispatch*&(this);
//unsigned int* x=new unsigned(4);
//static_cast&IDispatch*&(this)-&GetTypeInfoCount(x);
//::MessageBox(0,"its an GotType", 0, 0);
// Information on StringFromCLSID can be found here:
// /library/default.asp?url=/library/en-us/com/cmf_a2c_05r8.asp
StringFromCLSID(riid, &buf);
wchar_t buf1[150];
wsprintfW(buf1, L"adpbho: neither IID_IUnknown nor clsid_extie, %s", buf);
::CoTaskMemFree(buf);
// ::MessageBoxW(0, buf1, 0, 0);
*ppvObject = 0;
return E_NOINTERFACE;
return S_OK;
HRESULT STDMETHODCALLTYPE adpbho::GetSite(
REFIID riid,
void** ppvSite)
MB1("GetSite");
return E_NOINTERFACE;
// Provides the site\'s IUnknown pointer to the object. The object should hold onto this pointer,
// calling IUnknown::AddRef in doing so. If the object already has a site, it should call that
// existing site\'s IUnknown::Release, save the new site pointer, and call the new site\'s IUnknown::AddRef.
HRESULT STDMETHODCALLTYPE adpbho::#B(SetSite)(IUnknown* iu) {
MB1("SetSite");
// ::MessageBox(0, "SetSite", 0, 0);
if (! (iu-&QueryInterface(IID_IWebBrowser2, (void**) &webBrowser_) == S_OK )) {
MB1("QueryInterface failed on SetSite for IID_IWebBrowser2");
if (! (iu-&QueryInterface(IID_IConnectionPointContainer, (void**) &connectionPointContainer) == S_OK )) {
MB1("QueryInterface failed on SetSite for IID_IConnectionPointContainer");
// ::MessageBox(0, "xxx", 0, 0);
// make sure we\'re getting browser events
IConnectionPoint* spCP;
HRESULT hr = connectionPointContainer-&FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP);
if (FAILED(hr)) {
MB1("Failed hr")
hr = spCP-&Advise(static_cast&IDispatch*&(this), &cookie_);
b.vt=VT_BOOL;
b.boolVal=0x0000;
webBrowser_-&put_Resizable(0x0000);
return S_OK;
HRESULT STDMETHODCALLTYPE adpbho::GetTypeInfoCount(unsigned int FAR* pctinfo) {
//::MessageBox(0, "GetTypeInfoCount", 0, 0);
*pctinfo = 1;
return NOERROR;
// ------------------------------------------------------------
// /library/default.asp?url=/library/en-us/automat/htm_hh2/chap5_8anj.asp
HRESULT STDMETHODCALLTYPE adpbho::GetTypeInfo(
unsigned int
ITypeInfo FAR* FAR*
//::MessageBox(0, "GetTypeInfo", 0, 0);
return NOERROR;
// ------------------------------------------------------------
// /library/default.asp?url=/library/en-us/automat/htm_hh2/chap5_32cz.asp
HRESULT STDMETHODCALLTYPE adpbho::GetIDsOfNames(
OLECHAR FAR* FAR*
rgszNames,
unsigned int
DISPID FAR*
//::MessageBox(0, "GetTypeInfo", 0, 0);
return NOERROR;
// ------------------------------------------------------------
// /library/default.asp?url=/library/en-us/automat/htm_hh2/chap5_61id.asp
HRESULT STDMETHODCALLTYPE adpbho::Invoke(
dispIdMember,
DISPPARAMS FAR*
pDispParams,
VARIANT FAR*
pVarResult,
EXCEPINFO FAR*
pExcepInfo,
unsigned int FAR*
// See exdispid.h for a list of DISPIDs
switch (dispIdMember) {
case DISPID_BEFORENAVIGATE
case DISPID_NAVIGATECOMPLETE
case DISPID_STATUSTEXTCHANGE
case DISPID_QUIT
case DISPID_DOWNLOADCOMPLETE
case DISPID_COMMANDSTATECHANGE :
case DISPID_DOWNLOADBEGIN
case DISPID_NEWWINDOW
case DISPID_PROGRESSCHANGE
case DISPID_WINDOWMOVE
case DISPID_WINDOWRESIZE
case DISPID_WINDOWACTIVATE
case DISPID_PROPERTYCHANGE
case DISPID_TITLECHANGE
case DISPID_FRAMEBEFORENAVIGATE
case DISPID_FRAMENAVIGATECOMPLETE :
case DISPID_FRAMENEWWINDOW
case DISPID_BEFORENAVIGATE2
case DISPID_NEWWINDOW2
case DISPID_NAVIGATECOMPLETE2
case DISPID_ONQUIT
case DISPID_ONVISIBLE
case DISPID_ONTOOLBAR
case DISPID_ONMENUBAR
case DISPID_ONSTATUSBAR
case DISPID_ONFULLSCREEN
// on Msdn page
// /default.aspx?scid=EN-US;q246247
// it says:
// 1. Sink the WebBrowser control\'s events (the DWebBrowserEvents2 interface)
and capture the DocumentComplete event. Because the document is not guaranteed to
be fully loaded until this event fires, all document sinking must be done from here.
case DISPID_DOCUMENTCOMPLETE: {
CHR(webBrowser_-&get_Document(&document_));
if (! (document_-&QueryInterface(IID_IConnectionPointContainer, (void**) &connectionPointContainer) == S_OK )) {
::MessageBox(0, "xxx", 0, 0);
IConnectionPoint* cpHTMLD
// make sure we\'re getting browser events
HRESULT hr = connectionPointContainer-&FindConnectionPoint(DIID_HTMLDocumentEvents2, &cpHTMLDocument);
if (FAILED(hr)) {
::MessageBox(0, "DIID_HTMLDocumentEvents failed", 0, 0);
MB1("Failed hr")
//::MessageBox(0, "goin", 0, 0);
hr = cpHTMLDocument-&Advise(static_cast&IDispatch*&(this), &cookie_);
if (FAILED(hr)) {
::MessageBox(0, "Advise failed", 0, 0);
MB1("Failed hr")
case DISPID_ONTHEATERMODE
case DISPID_ONADDRESSBAR
//case DISPID_SELECTIONCHANGED:
// case DISPID_WINDOWREGISTERED
// case DISPID_WINDOWREVOKED
case DISPID_RESETFIRSTBOOTMODE:
case DISPID_RESETSAFEMODE:
case DISPID_REFRESHOFFLINEDESKTOP:
case DISPID_ADDFAVORITE:
case DISPID_ADDCHANNEL
case DISPID_ADDDESKTOPCOMPONENT
case DISPID_ISSUBSCRIBED
case DISPID_SHELLUIHELPERLAST
// The DISPIDs found from:
// /workshop/browser/mshtml/reference/events/htmldocumentevents2/htmldocumentevents2.asp?frame=true
* DISPID_HTMLDOCUMENTEVENTS_ONHELP
* DISPID_HTMLDOCUMENTEVENTS_ONCLICK
* DISPID_HTMLDOCUMENTEVENTS_ONDBLCLICK
* DISPID_HTMLDOCUMENTEVENTS_ONKEYDOWN
* DISPID_HTMLDOCUMENTEVENTS_ONKEYUP
* DISPID_HTMLDOCUMENTEVENTS_ONKEYPRESS
* DISPID_HTMLDOCUMENTEVENTS_ONMOUSEDOWN
* DISPID_HTMLDOCUMENTEVENTS_ONMOUSEMOVE
* DISPID_HTMLDOCUMENTEVENTS_ONMOUSEUP
* DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOUT
* DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOVER
* DISPID_HTMLDOCUMENTEVENTS_ONREADYSTATECHANGE
* DISPID_HTMLDOCUMENTEVENTS_ONBEFOREUPDATE
* DISPID_HTMLDOCUMENTEVENTS_ONAFTERUPDATE
* DISPID_HTMLDOCUMENTEVENTS_ONROWEXIT
* DISPID_HTMLDOCUMENTEVENTS_ONROWENTER
* DISPID_HTMLDOCUMENTEVENTS_ONDRAGSTART
* DISPID_HTMLDOCUMENTEVENTS_ONSELECTSTART
* DISPID_HTMLDOCUMENTEVENTS_ONERRORUPDATE
case DISPID_HTMLDOCUMENTEVENTS_ONCLICK: {
::MessageBox(0, "click", 0, 0);
// onkeydown is documented at:
// /workshop/browser/mshtml/reference/events/htmldocumentevents2/onkeydown.asp
case DISPID_HTMLDOCUMENTEVENTS_ONKEYDOWN: {
// DISPPARAMS are described at:
// /library/default.asp?url=/library/en-us/automat/htm_hh2/chap6_12gj.asp
if (pDispParams-&cArgs != 1) {
::MessageBox(0, "key down cArgs != 1", 0, 0);
VARIANTARG v = (pDispParams -& rgvarg)[0];
if (v.vt != VT_DISPATCH) {
::MessageBox(0, "vt.v != VT_DISPATCH", 0, 0);
IDispatch* i = v.pdispV
DISPID dispid_keyC
wchar_t* name_keyCode =
L"keyCode";
if (S_OK != i-&GetIDsOfNames(IID_NULL, &name_keyCode, 1, LOCALE_SYSTEM_DEFAULT, &dispid_keyCode)) {
::MessageBox(0, "GetIDsOfNames", 0, 0);
char buf[50];
sprintf(buf, "dispid_keyCode: %d", dispid_keyCode);
::MessageBox(0, buf, 0, 0);
::VariantInit(&result);
DISPPARAMS nullDispP
nullDispParams.rgvarg
nullDispParams.rgdispidNamedArgs = 0;
nullDispParams.cArgs
// ::MessageBox(0, "befor", 0, 0);
i-&Invoke(dispid_keyCode, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &nullDispParams, &result, 0, 0);
// ::MessageBox(0, "nach", 0, 0);
if (result.vt == VT_I4) {
// char buf[50];
// sprintf(buf, "char: %d", result.lVal);
// ::MessageBox(0, buf, 0, 0);
MB1(0, "result.vt", 0, 0);
default: {
char buf[50];
sprintf(buf, "dispID: %d", dispIdMember);
//::MessageBox(0, buf, 0, 0);
return NOERROR;创建一个BHO - leipei - 博客园
  BHO(Browser Helper Object,浏览器辅助对象,简称BHO)  BHO是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过简单的代码就可以进入浏览器领域的“交互接口”(INTERACTIVED Interface)。通过这个接口,程序员可以编写代码获取浏览器的行为,比如“后退”、“前进”、“当前页面”等,利用BHO的交互特性,程序员还可以用代码控制浏览器行为,比如修改替换浏览器工具栏,添加自己的程序按钮等。 &&&& --------------引自百度百科
在vs中创建一个BHO(使用C++),需要以下步骤: 1.新建一个ATL工程,起名为BHODemo 2.工程新建好之后,切换到类视图,新加一个ATL简单对象MyBHO,按照向导所示,添加过程中选中支持IObjectWithSite 3.可以看到,生成了一个接口实现类CMyBHO,在其中添加一个继承的父类:public& IDispEventImpl&1 ,CMyBHO,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1 ,1 & 和两个方法 STDMETHOD(SetSite)(IUnknown * pUnkSite);& // 覆盖父类IObjectWithSiteImpl的方法void STDMETHODCALLTYPE OnDocumentComplete(IDispatch* pDisp, VARIANT* URL);//文档加载完成时的动作
4.添加事件接收器部分: BEGIN_SINK_MAP(CMyBHO)&&& SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)END_SINK_MAP() 此时第一个参数1,要和IDispEventImpl后面参数中的1的数值要保持一致.这样DISPID_DOCUMENTCOMPLETE消息由IE传过来到BHO时,才会调用对应的OnDocumentComplete.可以继承多IDispEventImpl的,但要保证里面第一个参数,即序号不一样. 5.实现SetSite和OnDocumentComplete 由于暂时还不做更多操作,所以SetSite实现直接调用IObjectWithSiteImpl&CMyBHO&::SetSite(pUnkSite);而OnDocumentComplete先放空. 现在的源文件应该是长这个样子的:
// MyBHO.h : CMyBHO 的声明
#pragma once
#include "resource.h"
#include "ExDispid.h"
#include "BHODemo_i.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
using namespace ATL;
class ATL_NO_VTABLE CMyBHO :
public CComObjectRootEx&CComSingleThreadModel&,
public CComCoClass&CMyBHO, &CLSID_MyBHO&,
public IObjectWithSiteImpl&CMyBHO&,
public IDispatchImpl&IMyBHO, &IID_IMyBHO, &LIBID_BHODemoLib, /*wMajor =*/ 1, /*wMinor =*/ 0&,
IDispEventImpl&1 ,CMyBHO,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1 ,1 &
DECLARE_REGISTRY_RESOURCEID(IDR_MYBHO)
BEGIN_COM_MAP(CMyBHO)
COM_INTERFACE_ENTRY(IMyBHO)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP()
BEGIN_SINK_MAP(CMyBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
return S_OK;
void FinalRelease()
STDMETHOD(SetSite)(IUnknown * pUnkSite);
// 覆盖父类IObjectWithSiteImpl的方法
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch* pDisp, VARIANT* URL);//文档加载完成时的动作
OBJECT_ENTRY_AUTO(__uuidof(MyBHO), CMyBHO)
cpp文件应该是这样:
// MyBHO.cpp : CMyBHO 的实现
#include "stdafx.h"
#include "MyBHO.h"
// 覆盖父类IObjectWithSiteImpl的方法
STDMETHODIMP CMyBHO::SetSite(IUnknown * pUnkSite)
//调用基类实现。
return IObjectWithSiteImpl&CMyBHO&::SetSite(pUnkSite);
void STDMETHODCALLTYPE CMyBHO::OnDocumentComplete(IDispatch* pDisp, VARIANT* URL)//文档加载完成时的动作
6.注册表文件
修改BHODemo.rgs文件,删除原先内容,改为:HKLM
NoRemove SOFTWARE
NoRemove Microsoft
NoRemove Windows
NoRemove CurrentVersion
NoRemove Explorer
NoRemove 'Browser Helper Objects'
ForceRemove {E3C599B7-EB1D-462B-9ED8-D} = s 'BHO Demo Class'
val NoExplorer = d '1'
其中ForceRemove 后面的值是抄的idl文件中MyBHO的GUID的值.7.编译,然后打开IE就能看到是否启用BHODemo的提示了.win7下编译可能会出错,提示权限问题.这个时候,需要以管理员权限运行vs才行的.卸载:直接去工程debug目录中regsvr32 /u BHODemo.dll就行了.同样要注意win7下的权限问题.原本想暂时将BHO放放,结果发现了IDispEventImpl 的基类 IDispEventSimpleImpl,原来真正牛逼的方法都在这里呢。
0 #include &mshtmdid.h&
// DISPID_HTMLDOCUMENTEVENTS2_ONCLICK
1 新添加两种事件捕获,因为注册的基类有多个类有相同的方法,调用的时候需要指明,最好用typedef方便书写
class ATL_NO_VTABLE CMyRock :
public CComObjectRootEx&CComSingleThreadModel&,
public CComCoClass&CMyRock, &CLSID_MyRock&,
public IObjectWithSiteImpl&CMyRock&,
public IDispatchImpl&IMyRock, &IID_IMyRock, &LIBID_RockBHOLib, /*wMajor =*/ 1, /*wMinor =*/ 0&,
public IDispEventImpl&1, CMyRock, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1&,
public IDispEventImpl&2, CMyRock, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0&,
public IDispEventImpl&3, CMyRock, &DIID_HTMLWindowEvents2, &LIBID_MSHTML, 4, 0&
protected:
typedef IDispEventImpl&1, CMyRock, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1&BrowerE
typedef IDispEventImpl&2, CMyRock, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0&DocumentE
typedef IDispEventImpl&3, CMyRock, &DIID_HTMLWindowEvents2, &LIBID_MSHTML, 4, 0&WindowE
2 注册回调时要指明哪个基类
BEGIN_SINK_MAP(CMyRock)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2)
// 网页打开之前时调用
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
// 网页打开完毕时调用
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, OnQuit)
// 窗口关闭时调用
SINK_ENTRY_EX(2, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnMouseClick) // 点击鼠标时调用
SINK_ENTRY_EX(2, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONKEYPRESS, OnKeyPress) // 按键盘时调用
END_SINK_MAP()
3 定义注册需要的参数
CComPtr&IWebBrowser2&
CComQIPtr&IHTMLDocument2, &IID_IHTMLDocument2& m_spD
4 DispEventUnadvise时要指明基类,注意DispEventUnadvise,重复DispEventUnadvise会出错
&STDMETHODIMP CMyRock::SetSite(IUnknown* pUnkSite)
if (pUnkSite != NULL)
CComPtr&IServiceProvider& spSP;
HRESULT hr = pUnkSite-&QueryInterface(&spSP);
if(SUCCEEDED(hr) && spSP)
hr = spSP-&QueryService(IID_IWebBrowserApp, &m_spWebBrowser);
if (SUCCEEDED(hr))
// 注册以从 DWebBrowserEvents2 中汇集事件。
hr = BrowerEvents::DispEventAdvise(m_spWebBrowser);
if (SUCCEEDED(hr))
m_fAdvised = TRUE;
// 取消注册事件
if (m_fAdvised)
BrowerEvents::DispEventUnadvise(m_spWebBrowser);
m_fAdvised = FALSE;
// 在此释放缓存的指针和其他资源。
m_spWebBrowser.Release();
// 调用基类实现。
return IObjectWithSiteImpl&CMyRock&::SetSite(pUnkSite);
void STDMETHODCALLTYPE CMyRock::OnQuit()
if(m_fAdvisedDoc)
// m_spDoc是指针的拷贝,这里不用Release
DocumentEvents::DispEventUnadvise(m_spDoc);
m_fAdvisedDoc = FALSE;
DestroyDlg();
void STDMETHODCALLTYPE CMyRock::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
HRESULT hr = m_spWebBrowser-&get_HWND((LONG_PTR*)&hwnd);
CComPtr&IDispatch& pD
hr = m_spWebBrowser-&get_Document(&pDocument);
if (SUCCEEDED(hr))
if(m_fAdvisedDoc)
DocumentEvents::DispEventUnadvise(m_spDoc);
m_spDoc = pD
DocumentEvents::DispEventAdvise(m_spDoc, &DIID_HTMLDocumentEvents2);
m_fAdvisedDoc = TRUE;
m_fAdvisedDoc = FALSE;
5 这样就可以捕获键盘/鼠标事件了
VARIANT_BOOL
STDMETHODCALLTYPE OnMouseClick(IHTMLEventObj* _pEvtObj)
// IHTMLEventObj里包括了当前所有操作信息,具体按F1吧
// 如果VARIANT_FALSE将忽略此事件
return VARIANT_FALSE;
VARIANT_BOOL STDMETHODCALLTYPE OnKeyPress(IHTMLEventObj *_pEvtObj)
_pEvtObj-&get_keyCode(&t);
t = t + 1;
_pEvtObj-&put_keyCode(t);
return VARIANT_TRUE;
本文已收录于以下专栏:
相关文章推荐
在Windows操作系统上,我们最常见的浏览器有两种:文件浏览器(eXPloer.exe,应用于文件系统)和Internet浏览器(iexplore.exe,应用于互联网资源)。由于这两个浏览器功能强...
1。游戏自动登录,MousePosition.X获得系统鼠标位置的X坐标
     第一种方法:指定文本框的坐标,适用于窗口最大化按钮不能用的,如QQ游戏
      int x=500;
 &...
1 鼠标事件1.1 使用自带的Click方法每个对象都有自带的Click方法,通过其中第三个参数指定具体的鼠标事件(左键、右键、中建)例如: Browser(&New Page&).page(&New...
鼠标键盘事件
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent {
private...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3a6cad-ua98).
重新安装浏览器,或使用别的浏览器

我要回帖

更多关于 document.attachevent 的文章

 

随机推荐