Обработка при перемещении окна IE — Visual C++

Я хочу обрабатывать события перемещения окна. Моей первой попыткой было обработать события DWebBrowserEvents2::WindowSetHeight, WindowSetLeft, WindowSetTop и WindowSetWidth, но по некоторым причинам эти события вообще не срабатывали. Я обрабатывал изменение размера окна, обрабатывая HTMLWindowEvents2::onresize. Как бы я поступил, когда окно движется?

Я также пытался реализовать IHTMLOMWindowServices, но его элементы не вызываются при изменении положения окна. Есть ли какие-либо предложения относительно того, что было бы хорошим интерфейсом для реализации? Я создаю расширение IE, используя ATL в Visual C++.


person GotAmye    schedule 02.09.2009    source источник


Ответы (3)


Окно HTML — неподходящее место. Вам нужно подняться на один уровень вверх до уровня окна браузера, например:

            // 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");
        }

Затем onWindowMessage обрабатывает правильное сообщение:

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;
    }
}

Наслаждаться :)

person Ran Halprin    schedule 06.09.2009
comment
К сожалению, этот трюк не сработал. Я настроил WindowsHook (кажется, все в порядке), но функция обратного вызова OnWindowMessage никогда не вызывается :( - person GotAmye; 15.09.2009
comment
Возможно, функция обратного вызова должна быть статической... У меня сработало. - person Ran Halprin; 17.09.2009
comment
да, функция обратного вызова статическая. По-другому бы не получилось. - person GotAmye; 17.09.2009
comment
Нет, я имел в виду, что код не будет компилироваться без статического OnWindowMessage. Но событие перемещения по-прежнему не обрабатывается :( - person GotAmye; 22.09.2009
comment
Ммм странно. Возможно, вам следует опубликовать соответствующий код здесь, чтобы мы могли его тщательно изучить... - person Ran Halprin; 22.09.2009
comment
Теперь я вижу, что код не работает в IE8... В IE7 он работал нормально :( - person Ran Halprin; 27.10.2009

Обработал ситуацию с помощью Timer. Не слишком элегантно, но работает!

person GotAmye    schedule 15.10.2009

Хорошо, вот примерный код

    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
         }

}
person GotAmye    schedule 22.09.2009