ATL IE Addon: Capturing mouse events?
Hi,
I'm an ATL beginner using Visual Studio 2005 and read some guides and
tutorials to get an IE extension working:
Example:
http://msdn.microsoft.com/library/en-us/IETechCol/cols/dnexpie/expie_hello_bho.asp?frame=true
At this time I'm able to capture events using DWebBrowserEvents2.
Now I really need to capture mouse events, e.g. using HTMLDocumentEvents.
So how do I register the event sink for HTMLDocumentEvents?
How do I implement a working event handler?
I already read these guides from codeproject.com but I was not able to
get it working:
http://www.codeproject.com/atl/popupblocker.asp
http://www.codeproject.com/atl/popupblocker2.asp
http://www.codeproject.com/atl/MouseGestures.asp
The guides are mostly quite old and not easy to follow with Visual
Studio 2005
Is it possible to do capture mouse events without implementing the
invoke method? If I implement invoke(), it seems that I'm not able to
handle events with event sinks using SINK_ENTRY_EX anymore..
Thanks in advance for any help!
Peter
A piece of my code:
Klasse.h:
(...)
#include <shlguid.h> // IID_IWebBrowser2, DIID_DWebBrowserEvents2
#include <exdispid.h> // DISPID_DOCUMENTCOMPLETE, etc.
#include <mshtml.h> // IHTMLDocumentEvents and stuff..
#include <mshtmdid.h> // DISPID_HTMLDOCUMENTEVENTS_ONCLICK, etc.
(...)
class ATL_NO_VTABLE CKlasse :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CKlasse, &CLSID_Klasse>,
public IConnectionPointContainerImpl<CKlasse>,
public CProxy_IKlasseEvents<CKlasse>,
public IObjectWithSiteImpl<CKlasse>,
public IDispatchImpl<IKlasse, &IID_IKlasse, &LIBID_ProjektLib, /*wMajor
=*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CKlasse, &DIID_DWebBrowserEvents2,
&LIBID_SHDocVw, 1, 1>,
// another derive from IDispEventImpl for HTMLDocumentEvents..
// is this correct?
public IDispEventImpl<2, CKlasse, &DIID_HTMLDocumentEvents,
&LIBID_MSHTML, 1, 1>
(...)
BEGIN_SINK_MAP(CKlasse)
// first sink entry to handle DISPID_DOCUMENTCOMPLETE
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE,
OnDocumentComplete)
// second sink entry to handle DISPID_HTMLDOCUMENTEVENTS_ONCLICK..
// correct?
SINK_ENTRY_EX(2, DIID_HTMLDocumentEvents,
DISPID_HTMLDOCUMENTEVENTS_ONCLICK, OnClick)
END_SINK_MAP()
(...)
private:
BOOL m_fAdvisedHTML;
***************
Klasse.cpp:
(...)
STDMETHODIMP CKlasse::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite != NULL) {
// Cache the pointer to IWebBrowser2.
HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void
**)&m_spWebBrowser);
if (SUCCEEDED(hr)) {
// Register to sink events from DWebBrowserEvents2.
// Need to disambiguate calls..
hr = IDispEventImpl<1, CIEAddonBHO,
&DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1,
1>::DispEventAdvise(m_spWebBrowser);
if (SUCCEEDED(hr)) {
m_fAdvised = TRUE;
}
hr = IDispEventImpl<2, CIEAddonBHO,
&DIID_HTMLDocumentEvents, &LIBID_MSHTML, 1,
1>::DispEventAdvise(m_spWebBrowser);
if (SUCCEEDED(hr)) {
m_fAdvisedHTML = TRUE;
}
}
} else {
// Unregister event sink.
// Again disambiguation..
if (m_fAdvised) {
IDispEventImpl<1, CIEAddonBHO, &DIID_DWebBrowserEvents2,
&LIBID_SHDocVw, 1, 1>::DispEventUnadvise(m_spWebBrowser);
m_fAdvised = FALSE;
}
if (m_fAdvisedHTML) {
IDispEventImpl<2, CIEAddonBHO, &DIID_HTMLDocumentEvents,
&LIBID_MSHTML, 1, 1>::DispEventUnadvise(m_spWebBrowser);
m_fAdvisedHTML = FALSE;
}
// Release cached pointers and other resources here.
m_spWebBrowser.Release();
}
// Call base class implementation.
return IObjectWithSiteImpl<CKlasse>::SetSite(pUnkSite);
}