Вопрос

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

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

Это было полезно?

Решение 2

Handled the situation by using Timer. Not too elegant, but works!

Другие советы

HTML window is not the right place. You need to go one level up to the browser window level, e.g.:

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

Then onWindowMessage handles the right message:

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

Enjoy :)

Okay, here's some rough 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
         }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top