我在用ATL开发BHO时遇到这样的一个功能需求:需要监视IE窗口移动并在页面内容中做出改变。
在实际开发中,DISPID_WINDOWMOVE微软的mshtml库并未实现它,这个event根本没有fire。
然后我有想通过HOOK的方式来监视还是无法成功。
我贴出部分代码
long m_pWebBrowserHwnd;
mWebBrowser2->get_HWND(&m_pWebBrowserHwnd);
if(m_pWebBrowserHwnd)
{ int idHook = WH_CALLWNDPROC; // Type of hook: all Window calls
HOOKPROC hookProc = OnWindowMessage; // Procedure to be called
HINSTANCE hMod = NULL; // DLL to monitor
DWORD dwThreadId = GetWindowThreadProcessId((HWND)m_pWebBrowserHwnd,NULL); // IE Thread to monitor
HHOOK m_ResizeHook = SetWindowsHookEx(idHook, hookProc, hMod, 0);
::MessageBox(NULL,_T("获取句柄") ,_T("Warning"),MB_ICONSTOP);
}
LRESULT CALLBACK OnWindowMessage(int nCode, WPARAM wParam, LPARAM lParam)
{LRESULT result = CallNextHookEx(NULL, nCode, wParam, lParam);
::MessageBox(NULL,_T("窗口移动了") ,_T("Warning"),MB_ICONSTOP);
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
::MessageBox(NULL,_T("窗口移动了") ,_T("Warning"),MB_ICONSTOP);
break;
}
}
return S_OK;
}经过测试仍然无法获得IE窗口移动的句柄。
请问有什么好办法解决这个问题?能贴出部分代码更好,谢谢。ATLBHO
在实际开发中,DISPID_WINDOWMOVE微软的mshtml库并未实现它,这个event根本没有fire。
然后我有想通过HOOK的方式来监视还是无法成功。
我贴出部分代码
long m_pWebBrowserHwnd;
mWebBrowser2->get_HWND(&m_pWebBrowserHwnd);
if(m_pWebBrowserHwnd)
{ int idHook = WH_CALLWNDPROC; // Type of hook: all Window calls
HOOKPROC hookProc = OnWindowMessage; // Procedure to be called
HINSTANCE hMod = NULL; // DLL to monitor
DWORD dwThreadId = GetWindowThreadProcessId((HWND)m_pWebBrowserHwnd,NULL); // IE Thread to monitor
HHOOK m_ResizeHook = SetWindowsHookEx(idHook, hookProc, hMod, 0);
::MessageBox(NULL,_T("获取句柄") ,_T("Warning"),MB_ICONSTOP);
}
LRESULT CALLBACK OnWindowMessage(int nCode, WPARAM wParam, LPARAM lParam)
{LRESULT result = CallNextHookEx(NULL, nCode, wParam, lParam);
::MessageBox(NULL,_T("窗口移动了") ,_T("Warning"),MB_ICONSTOP);
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
::MessageBox(NULL,_T("窗口移动了") ,_T("Warning"),MB_ICONSTOP);
break;
}
}
return S_OK;
}经过测试仍然无法获得IE窗口移动的句柄。
请问有什么好办法解决这个问题?能贴出部分代码更好,谢谢。ATLBHO
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货