***********问题解决后将有高分追加*************
已使用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); 
         }***********问题解决后将有高分追加*************

解决方案 »

  1.   

    Sorry to disappoint you, but there is no way you can modify the source code of the ShellWindows object to list other windows.
      

  2.   

    可是我可以通过spBrowser得到HTMLDocument2的指针,并取得网页中的所有元素,为什么却不能得到他的HWND呢?而且IE的HWND我都可以得到,说明并非ShellWindows的原因,请再帮我看看,我相信这种方法一定可以取得成功的。
      

  3.   

    It is your restriction of using IShellWindows, not mine.
      

  4.   

    Don't accuse people who want to helped you for none of your business.
    Most computers in U.S. do not have any Chinese input method installed.
      

  5.   

    Don't accuse people who want to helped you for none of your business.
    Most computers in U.S. do not have any Chinese input method installed.
      

  6.   

    我其实是想将每个窗口的HWND取得,然后再用pBODY->get_xxxxHTML()取它的网页内容,并将这二部分内容保存关联,如果有多个窗口,就有多个不同的HWND,我要利用HWND与其内容相关联,如果不使用我上面的方法实现,不知还有什么方法可以?而且我还是不太明白,为什么我使用上面的方法可以对IE进行这样的关联(即得到多个IE窗口的HWND及其网页内容),却不能对Maxthon(也是IE内核)进行这样的操作呢?本来想用BHO的方法,可是Maxthon对插件有特殊要求,默认情况还是不安装的,这样不利于我的程序发布,所以现在放弃使用BHO的方法了,希望能有更好的方法实现我的要求。我还是认为我上面的方法是可行的,可以帮我再看看吗?或者调试一下?不可能IE行而MYIE不行的啊?
      

  7.   

    get_HWND对Maxthon,TT这些浏览器都无效,你还是另想办法。
    不过,你可以枚举类名为"Internet Explorer_Server"的窗口,得到HWND 再获得 IWebBrowser2
      

  8.   

    经过多次修改调试,我已顺利对Maxthon进行get_HWND(),我在前面说了一定可以get_HWND()的,大家偏偏不肯动手测试一下,硬是说不行,我再将"不可能不行"的原因也说出来了,还是说不行,现在不是证明完全可以的吗?唉,大家能不能有点"急人所急"的精神啊,好了,这里就不多说了,现在我虽然已顺利get_HWND(),不过还是无法取得其类名,虽说这个现在已不是必需的了,但还是想知道如何可取得,谢谢lbird,你说的方法也不错,我有空的话也试试.现在还有一个小问题,我在Maxthon进行get_HWND后,得到了多个HWND变量(因为已打开多个网页窗口),我发现有些窗口的HWND竟然是会变的,(我是说HWND的值),后来发现是该窗口的网页每过一秒就自动刷新了一下(网页某部份刷新,不是全部),我想知道,我如何通过其HWND或其IWebBrowser2指针,又或是其HTMLDocument2指针来控制它不再"自动刷新"?我试了对网页进行Stop操作,但没有任何作用,该怎么办?我在上面说HWND的值会变是这样得出来的:我将取得的HWND值转为CString类型并使用MessageBox显示出来,发现有些网页的HWND值再重新获取后是变的,有的是不变的,我想问一下,如果有一个HWND指针一直指着该网页,如果该网页被刷新,这个HWND还有效吗?也就是说还指向这个网页吗?如果不再有效,那么有没有可以保持有效的指针?不知HTMLDocument2可不可以?我主要是想对网页内容进行更改,如果网页被刷新要及时被通知到,但由于不是BHO程序,所以不知如何被通知,只好采取不断获取所有IE窗口并检查的方法来判断是否是新的窗口,或已被刷新或改了网址的窗口,如果一个窗口原来被获取过,在链表中会记录下来,并保存已相关数据,但其刷新后HWND变了,我的链表时就会存在很多垃圾HWND记录(原记录的数据已无用,HWND也无效了),所以要能判断某些HWND已获取过,但其窗口已被刷新或已浏览到其它地址,以便更新这个HWND在链表中记录的内容,以免造成不断浏览链表就不断彭涨的情况,这不等于内存泄露吗?希望能帮我解答一下.最好能告知:如何得到网页DownloadComplate()或类似的通知?我就想在网页完全下载完成但还没显示出来之时得到通知,但能控制它.
      

  9.   

    还是可以的,自己搞定了,CSDN越来越让人失望了,我一共才问过几个问题,在我的印象里没有问题是CSDN的网友解答的,最后不是自己处理掉的,就是不了了之,CSDN混分的人越来越多了,嘿嘿,建议:如果问题无人解答应可以取消给分,或将分给一个系统空号。