Handle, wenn sich das Fenster bewegt - visuell C ++
-
21-09-2019 - |
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 ++.
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
}
}