Необходимо перехватывать(в целях логирования) следующие события:
1.Ввели текст в текстовое поле(input type=text ,textarea,input type=pass).
2.Кликнули по html элементу.
3.Навели мышь на некоторый html элемент.
Как это можно осуществить,в наличии имеется ссылка на экземпляр IWebBrowser2?
У меня пока только 1 идея -добавлять нужный мне обработчик этих событий во все html элементы (это точно можно сделать средствами javascript,думаю,COM интерфейсы тоже должны содержать что нибудь подобное).
Есть ли способ лучше?
Re: Как логировать события html элементов в Internet Explore
Здравствуйте, vitaliy666, Вы писали:
V>Необходимо перехватывать(в целях логирования) следующие события: V>1.Ввели текст в текстовое поле(input type=text ,textarea,input type=pass). V>2.Кликнули по html элементу. V>3.Навели мышь на некоторый html элемент.
V>Как это можно осуществить,в наличии имеется ссылка на экземпляр IWebBrowser2? V>У меня пока только 1 идея -добавлять нужный мне обработчик этих событий во все html элементы (это точно можно сделать средствами javascript,думаю,COM интерфейсы тоже должны содержать что нибудь подобное). V>Есть ли способ лучше?
Интерфейс IHTMLDocument3 имеет метод attachEvent,которому на вход подается ссылка на объект IDispatch и наименование нужных эвентов.
Внимание,вопрос:
1.Достаточно ли просто унаследовать класс от этого интерфейса,определить все методы,нужные для работы этого интерфейса,и потом подать ссылку на класс на вход метода attachEvent?
2.Какой метод будет вызываться при срабатывании события?
Как можно будет установить источник срабатывания события?
Re[2]: Как логировать события html элементов в Internet Expl
V>Интерфейс IHTMLDocument3 имеет метод attachEvent,которому на вход подается ссылка на объект IDispatch и наименование нужных эвентов. V>Внимание,вопрос: V>1.Достаточно ли просто унаследовать класс от этого интерфейса,определить все методы,нужные для работы этого интерфейса,и потом подать ссылку на класс на вход метода attachEvent?
Класс нужно унаследовать от IDispatch, да.
V>2.Какой метод будет вызываться при срабатывании события?
IDispatch::Invoke с DISPID = DISPID_VALUE
V>Как можно будет установить источник срабатывания события?
Получив через IHTMLWindow2::get_event событие event
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re: Как логировать события html элементов в Internet Explore
Здравствуйте, vitaliy666, Вы писали:
V>Необходимо перехватывать(в целях логирования) следующие события: V>1.Ввели текст в текстовое поле(input type=text ,textarea,input type=pass). V>2.Кликнули по html элементу. V>3.Навели мышь на некоторый html элемент.
V>Как это можно осуществить,в наличии имеется ссылка на экземпляр IWebBrowser2? V>У меня пока только 1 идея -добавлять нужный мне обработчик этих событий во все html элементы (это точно можно сделать средствами javascript,думаю,COM интерфейсы тоже должны содержать что нибудь подобное). V>Есть ли способ лучше?
где spDocument — IHTMLDocument2*
также твой класс также должен наследовать интерфейс IDispEventSimpleImpl
также необходимо в нидере класса описать такую карту сообщений документа
Здравствуйте, mager, Вы писали:
M>Здравствуйте, vitaliy666, Вы писали:
V>>Необходимо перехватывать(в целях логирования) следующие события: V>>1.Ввели текст в текстовое поле(input type=text ,textarea,input type=pass). V>>2.Кликнули по html элементу. V>>3.Навели мышь на некоторый html элемент.
V>>Как это можно осуществить,в наличии имеется ссылка на экземпляр IWebBrowser2? V>>У меня пока только 1 идея -добавлять нужный мне обработчик этих событий во все html элементы (это точно можно сделать средствами javascript,думаю,COM интерфейсы тоже должны содержать что нибудь подобное). V>>Есть ли способ лучше?
M>HRESULT hRet = IDispEventSimpleImpl<_nDocID, CSampleClass, &DIID_HTMLDocumentEvents2>:: M> DispEventAdvise(spDocument, &DIID_HTMLDocumentEvents2);
M>где spDocument — IHTMLDocument2* M>также твой класс также должен наследовать интерфейс IDispEventSimpleImpl M>также необходимо в нидере класса описать такую карту сообщений документа
M> BEGIN_SINK_MAP(CSampleClass) M> SINK_ENTRY_INFO(_nDocID, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnClick, &DocumentEventInfo) M> SINK_ENTRY_INFO(_nDocID, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOUT, OnMouseOut, &DocumentEventInfo) M> SINK_ENTRY_INFO(_nDocID, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONKEYPRESS, OnKeyPress, &DocumentEventInfo) M> END_SINK_MAP()
Я унаследовал класс от IDispEventSimpleImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2>,
Объявил карту событий.Проект не компилируется,потому что не найдено объявление DocumentEventInfo.
Где и как нужно данную переменную объявлять?
class ATL_NO_VTABLE CHelloWorldBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
public IObjectWithSiteImpl<CHelloWorldBHO>,
public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
//public IDispEventImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 1, 1>
public IDispEventSimpleImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2>
{
BEGIN_SINK_MAP(CHelloWorldBHO)
//SINK_ENTRY_EX(0, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnMouseClick)
SINK_ENTRY_INFO(0, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnMouseClick, &DocumentEventInfo)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
Здравствуйте, vitaliy666, Вы писали:
V>Здравствуйте, mager, Вы писали:
M>>Здравствуйте, vitaliy666, Вы писали:
V>>>Необходимо перехватывать(в целях логирования) следующие события: V>>>1.Ввели текст в текстовое поле(input type=text ,textarea,input type=pass). V>>>2.Кликнули по html элементу. V>>>3.Навели мышь на некоторый html элемент.
V>>>Как это можно осуществить,в наличии имеется ссылка на экземпляр IWebBrowser2? V>>>У меня пока только 1 идея -добавлять нужный мне обработчик этих событий во все html элементы (это точно можно сделать средствами javascript,думаю,COM интерфейсы тоже должны содержать что нибудь подобное). V>>>Есть ли способ лучше?
M>>HRESULT hRet = IDispEventSimpleImpl<_nDocID, CSampleClass, &DIID_HTMLDocumentEvents2>:: M>> DispEventAdvise(spDocument, &DIID_HTMLDocumentEvents2);
M>>где spDocument — IHTMLDocument2* M>>также твой класс также должен наследовать интерфейс IDispEventSimpleImpl M>>также необходимо в нидере класса описать такую карту сообщений документа
M>> BEGIN_SINK_MAP(CSampleClass) M>> SINK_ENTRY_INFO(_nDocID, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnClick, &DocumentEventInfo) M>> SINK_ENTRY_INFO(_nDocID, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOUT, OnMouseOut, &DocumentEventInfo) M>> SINK_ENTRY_INFO(_nDocID, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONKEYPRESS, OnKeyPress, &DocumentEventInfo) M>> END_SINK_MAP()
V>Я унаследовал класс от IDispEventSimpleImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2>, V>Объявил карту событий.Проект не компилируется,потому что не найдено объявление DocumentEventInfo. V>Где и как нужно данную переменную объявлять?
V>class ATL_NO_VTABLE CHelloWorldBHO : V> public CComObjectRootEx<CComSingleThreadModel>, V> public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>, V> public IObjectWithSiteImpl<CHelloWorldBHO>, V> public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, V> public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>, V> //public IDispEventImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 1, 1> V> public IDispEventSimpleImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2> V>{ V>BEGIN_SINK_MAP(CHelloWorldBHO) V> //SINK_ENTRY_EX(0, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnMouseClick) V> SINK_ENTRY_INFO(0, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnMouseClick, &DocumentEventInfo) V> SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
V>END_SINK_MAP() V> VARIANT_BOOL STDMETHODCALLTYPE OnMouseClick(IHTMLEventObj* _pEvtObj); V>}
Разобрался —
нужно объявить структуру в заголовочном файле:
static _ATL_FUNC_INFO OnDocumentInfo = {
CC_STDCALL, // Calling convention.
VT_I4, // Return type.
1, // Number of arguments.
{VT_DISPATCH} // Argument types.
};
Объявление класса:
class ATL_NO_VTABLE CHelloWorldBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
public IObjectWithSiteImpl<CHelloWorldBHO>,
public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
public IDispEventSimpleImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2>