有高分:通过IWebBrowser2指针取Maxthon的各子浏览窗口的HWND
***********问题解决后将有高分追加*************
已使用IShellWindows得到了所有Explorer窗口(包括IE及资源管理器,其中IE是指使用IE内核的所有浏览器,包括MYIE、HELP窗口),并用get_Count()得到了这些窗口的数量,之后枚举每一个窗口,并得到其IWebBrowser2指针spBrowser,接着使用spBrowser->GetHWND()得到一个该指针指向的窗口的HWND,但是我反复调试,却只能得到微软IE的窗口的HWND及其类名IEFrame,就是得不到Maxthon(即MYIE2)的HWND,当然也就得不到其所属类的类名了。
以下是具体代码,请帮小弟看看是何原因?要说明的是以下代码已完全取得了所有IE窗口,因为我在后面加入代码可再从中取得HTMLDocument2的指针,并将所有IE窗口(包括MYIE)的背景色改变。从GetLastError()返回的信息可见HWND的获取过程也是“顺利完成”的,另外,本人只想使用IShellWindows来得到的IE的所有窗口,不要使用EnumWindows()或FindWindows()这样的方法,原因我就不多说了,否则不算解决问题,总之,以下请在以下代码的基础上找出原因并作也修改,谢谢大家。
***********问题解决后将有高分追加*************
//以下代码是在实际程序中复制和修改而成,主要是为了说明我的实现流程,如果不能调试通过,请自行修正。可能都是一些括号或逗号之类的小问题。
CComPtr< IShellWindows > spShellWin;
HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows ); //ShellWindows
if ( FAILED ( hr ) )
{
MessageBox(NULL,_T("获取 IShellWindows 接口错误"),_T("提示"),MB_OK);
return;
}
long nCount = 0; // 取得浏览器实例个数(资源管理器和IE核心的浏览器)
spShellWin->get_Count( &nCount );
if( 0 == nCount )
{
MessageBox(NULL,_T("没有在运行着的浏览器"),_T("提示"),MB_OK);
return;
}
for(int i=0; i<nCount; i++)
{
CComPtr< IDispatch > spDispIE;
hr=spShellWin->Item(CComVariant( (long)i ), &spDispIE );
if ( FAILED ( hr ) ) continue;
CComQIPtr< IWebBrowser2 > spBrowser = spDispIE;
if ( !spBrowser ) continue;
//下面是取得类名,但就是无法取得Maxthon的类名,因为无法取得其HWND
TCHAR szClassName[_MAX_PATH];
ZeroMemory(szClassName,_MAX_PATH * sizeof(TCHAR));
HWND hwnd=NULL;
spBrowser->get_HWND(reinterpret_cast<long*>(&hwnd));
LPVOID lpMsgBuf;
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);
MessageBox(NULL,(LPCTSTR)lpMsgBuf,_T("提示"),MB_OK|MB_ICONINFORMATION);
if (hwnd==NULL)
{
MessageBox(NULL,_T("无法取得IE窗口HWND"),_T("取HWND错误"),MB_OK);
return;
}
::GetClassName(hwnd,szClassName,_MAX_PATH);
MessageBox(NULL,szClassName,_T("类名"),MB_OK);
}
***********问题解决后将有高分追加*************