Ручка при перемещении окна IE - Visual C ++
-
21-09-2019 - |
Вопрос
Я хочу справиться с событиями перемещения окна. Моя первая попытка - справиться 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
}
}