Frage

Ich möchte Fensterverschiebenereignisse behandeln. Mein erster Versuch war es zu handhaben DWebBrowserEvents2::WindowSetHeight, WindowSetLeft, WindowSetTop und WindowSetWidth Ereignisse, aber aus einigen Gründen wurden diese Ereignisse überhaupt nicht entlassen. Ich habe die Fenstergrößenregründung durch Handhabung mit der Größe des Fensters behandelt HTMLWindowEvents2::onresize. Wie würde ich damit umgehen, wenn sich das Fenster bewegt?

Ich habe auch versucht, implementiert zu werden IHTMLOMWindowServices, aber seine Mitglieder werden nicht aufgerufen, wenn sich die Fensterposition ändert. Gibt es Vorschläge, was eine gute Schnittstelle implementieren würde? Ich erstelle eine IE -Erweiterung mit ATL in Visual C ++.

War es hilfreich?

Lösung 2

Behandelte die Situation mit Timer. Nicht zu elegant, aber funktioniert!

Andere Tipps

Das HTML -Fenster ist nicht der richtige Ort. Sie müssen ein Level bis zum Browserfensterebene, z. B.:

            // Get a handle for the IE window and set a hook for the window resize/move events
        m_spWebBrowser->get_HWND(reinterpret_cast<SHANDLE_PTR*>(&m_pWebBrowserHwnd));
        if(m_pWebBrowserHwnd)
        {
            int idHook = WH_CALLWNDPROC; // Type of hook: all Window calls
            HOOKPROC hookProc = MyClass::OnWindowMessage; // Procedure to be called
            HINSTANCE hMod = NULL; // DLL to monitor
            DWORD dwThreadId = GetWindowThreadProcessId(m_pWebBrowserHwnd,NULL); // IE Thread to monitor
            m_ResizeHook = SetWindowsHookEx(idHook, hookProc, hMod, dwThreadId); 
            Trace (L"Hook for window move/resize is set up");
        }

Dann verarbeitet OnwindowMessage die richtige Nachricht:

LRESULT CALLBACK MyClass::OnWindowMessage(int nCode, WPARAM wParam, LPARAM lParam)
{

LRESULT result = CallNextHookEx(NULL, nCode, wParam, lParam);

if( (lParam!=NULL) && (nCode == HC_ACTION))
{
    CWPSTRUCT *CwpStruct = (CWPSTRUCT *) lParam;
    switch(CwpStruct->message)
    {
    case WM_MOVE:
        HWND manipluatedHWND = CwpStruct->hwnd;
            //Code to execute when window moves
        break;
    }
}

Genießen :)

Okay, hier ist ein grober Code

    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>, 
      //Other interfaces here
{

             BEGIN_SINK_MAP(CHelloWorldBHO)
                SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)//Do stuff OnDocumentComplete
             END_SINK_MAP()

         void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL){
             //Do other stuff here
             SetUpWindowsHook();//This calls a function that sets a window hook, similar to the code that you've posted
         }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top