Browser StatusTextChange
-
Ich will vom Internetexplorer alle Statusbar Text Änderungen bekommen.
Ich hab ne Klasse gemacht, die DWebBrowserEvents2 implementiert und weise die zu. Da gibt es auch keine Fehlermeldung. Aber leider wird meine Funktion StatusTextChange auch nie aufgerufen. Was mach ich falsch? Hab ich was vergessen?#include <shlobj.h> #include <atlbase.h> #include <atlcom.h> #include <comdef.h> #include <windows.h> #include <string> class EventHandler : public DWebBrowserEvents2 { public: // IUnknown virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) { if (riid == IID_IUnknown || riid == IID_IDispatch || riid == DIID_DWebBrowserEvents2) { *ppvObject = (void*)this; return S_OK; } return E_NOINTERFACE; } virtual ULONG STDMETHODCALLTYPE AddRef() { return 1L; } virtual ULONG STDMETHODCALLTYPE Release() { return 1L; } // IDispatch virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( UINT __RPC_FAR *pctinfo) { return E_NOTIMPL; } virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo) { return E_NOTIMPL; } virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( REFIID riid, LPOLESTR __RPC_FAR *rgszNames, UINT cNames, LCID lcid, DISPID __RPC_FAR *rgDispId) { return E_NOTIMPL; } virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr) { return E_NOTIMPL; } void StatusTextChange (_bstr_t Text ); void DocumentComplete (IDispatch * pDisp, VARIANT * URL ); void ProgressChange (long Progress, long ProgressMax ){} void CommandStateChange (long Command, VARIANT_BOOL Enable ){} void DownloadBegin ( ){} void DownloadComplete ( ){} void TitleChange (_bstr_t Text ){} void PropertyChange (_bstr_t szProperty ){} void BeforeNavigate2 (IDispatch * pDisp, VARIANT * URL, VARIANT * Flags, VARIANT * TargetFrameName, VARIANT * PostData, VARIANT * Headers, VARIANT_BOOL * Cancel ){} void NewWindow2 (IDispatch * * ppDisp, VARIANT_BOOL * Cancel ){} void NavigateComplete2 (IDispatch * pDisp, VARIANT * URL ){} void OnQuit ( ){} void OnVisible ( VARIANT_BOOL Visible ){ } void OnToolBar ( VARIANT_BOOL ToolBar ){} void OnMenuBar ( VARIANT_BOOL MenuBar ){} void OnStatusBar ( VARIANT_BOOL StatusBar ){} void OnFullScreen ( VARIANT_BOOL FullScreen ){} void OnTheaterMode (VARIANT_BOOL TheaterMode ){} void WindowSetResizable (VARIANT_BOOL Resizable ){} void WindowSetLeft (long Left ){} void WindowSetTop (long Top ){} void WindowSetWidth (long Width ){} void WindowSetHeight (long Height ){} void WindowClosing (VARIANT_BOOL IsChildWindow, VARIANT_BOOL * Cancel ){} void ClientToHostWindow (long * CX, long * CY ){} void SetSecureLockIcon ( long SecureLockIcon ){} void FileDownload (VARIANT_BOOL * Cancel ){} void NavigateError (IDispatch * pDisp, VARIANT * URL, VARIANT * Frame, VARIANT * StatusCode, VARIANT_BOOL * Cancel ){} void PrintTemplateInstantiation (IDispatch * pDisp ){} void PrintTemplateTeardown (IDispatch * pDisp ){} void UpdatePageStatus (IDispatch * pDisp, VARIANT * nPage, VARIANT * fDone ){} void PrivacyImpactedStateChange (VARIANT_BOOL bImpacted ){} }; void EventHandler::StatusTextChange (_bstr_t Text ){ MessageBox(0,Text,L"status",0); } void EventHandler::DocumentComplete(IDispatch *pDisp, VARIANT *URL) { MessageBox(0,L"doc complete",L"",0); } LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) { switch (uiMessage) { case WM_CLOSE: DestroyWindow(hWnd); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: break; } return DefWindowProc(hWnd, uiMessage, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.hCursor = NULL; wc.hIcon = NULL; wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = L"mybrowsertest"; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); HWND hWnd = CreateWindow(L"mybrowsertest", L"mybrowsertest", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); IWebBrowser2* webBrowser; CoInitialize(0); CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_ALL, IID_IWebBrowser2, (LPVOID*)&webBrowser); if(webBrowser == NULL) { return 2; } EventHandler handler; IUnknown *pUnk = NULL; IUnknown *pHandler = NULL; DWORD dwCookie; HRESULT hr; hr = handler.QueryInterface(IID_IUnknown, (void**)&pHandler); hr = webBrowser->QueryInterface(IID_IUnknown, (void**)&pUnk); IConnectionPointContainer* pCPC = NULL; IConnectionPoint* pCP = NULL; hr = pUnk->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC); if (SUCCEEDED(hr)) { hr = pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &pCP); if (SUCCEEDED(hr)) { hr = pCP->Advise(pHandler, &dwCookie); if (SUCCEEDED(hr)) { MessageBox(0,L"advised",L"",0); //pCP->Release(); } } pCPC->Release(); } pUnk->Release(); BSTR url = W2BSTR(L"http://www.google.de"); VARIANT empty = { 0 }; webBrowser->Navigate(url, &empty, &empty, &empty, &empty); webBrowser->put_Visible(VARIANT_TRUE); MSG msg; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } BSTR statusText; std::wstring lastStatus = L""; while(webBrowser->get_StatusText(&statusText) == S_OK) { MessageBox(0, statusText, L"",0); } return 0; }PS: Das polling nachher mit get_StatusText funktioniert.
-
virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr) { switch (dispIdMember) { case DISPID_STATUSTEXTCHANGE: BSTR statusText; webBrowser->get_StatusText(&statusText); MessageBox(0,statusText, L"",0); break; } return S_OK; }und den webBrowser einfach global machen