有高分:通过IWebBrowser2指针取Maxthon的各子浏览窗口的HWND

TianChong 2006-03-07 09:04:24
***********问题解决后将有高分追加*************
已使用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);
}

***********问题解决后将有高分追加*************
...全文
278 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
TianChong 2006-03-18
  • 打赏
  • 举报
回复
还是可以的,自己搞定了,CSDN越来越让人失望了,我一共才问过几个问题,在我的印象里没有问题是CSDN的网友解答的,最后不是自己处理掉的,就是不了了之,CSDN混分的人越来越多了,嘿嘿,建议:如果问题无人解答应可以取消给分,或将分给一个系统空号。
TianChong 2006-03-18
  • 打赏
  • 举报
回复
最后期限了,有人能回答吗?
TianChong 2006-03-13
  • 打赏
  • 举报
回复
经过多次修改调试,我已顺利对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()或类似的通知?我就想在网页完全下载完成但还没显示出来之时得到通知,但能控制它.
lbird 2006-03-13
  • 打赏
  • 举报
回复
get_HWND对Maxthon,TT这些浏览器都无效,你还是另想办法。
不过,你可以枚举类名为"Internet Explorer_Server"的窗口,得到HWND 再获得 IWebBrowser2
TianChong 2006-03-11
  • 打赏
  • 举报
回复
有人能解答吗?如果不能,500分将无人可给,可惜了...我也还要另想他法来解决...方法是有,只是会效率低一些,万不得已还真不想这样处理啊,高手请现身吧!!!!!!!!!!!!!
TianChong 2006-03-08
  • 打赏
  • 举报
回复
可是我可以通过spBrowser得到HTMLDocument2的指针,并取得网页中的所有元素,为什么却不能得到他的HWND呢?而且IE的HWND我都可以得到,说明并非ShellWindows的原因,请再帮我看看,我相信这种方法一定可以取得成功的。
TianChong 2006-03-08
  • 打赏
  • 举报
回复
我其实是想将每个窗口的HWND取得,然后再用pBODY->get_xxxxHTML()取它的网页内容,并将这二部分内容保存关联,如果有多个窗口,就有多个不同的HWND,我要利用HWND与其内容相关联,如果不使用我上面的方法实现,不知还有什么方法可以?而且我还是不太明白,为什么我使用上面的方法可以对IE进行这样的关联(即得到多个IE窗口的HWND及其网页内容),却不能对Maxthon(也是IE内核)进行这样的操作呢?本来想用BHO的方法,可是Maxthon对插件有特殊要求,默认情况还是不安装的,这样不利于我的程序发布,所以现在放弃使用BHO的方法了,希望能有更好的方法实现我的要求。我还是认为我上面的方法是可行的,可以帮我再看看吗?或者调试一下?不可能IE行而MYIE不行的啊?
TianChong 2006-03-08
  • 打赏
  • 举报
回复
你也在美国吗?如果这样还算是情有可言,错怪你了。 ^_^
蒋晟 2006-03-08
  • 打赏
  • 举报
回复
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.
蒋晟 2006-03-08
  • 打赏
  • 举报
回复
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.
蒋晟 2006-03-08
  • 打赏
  • 举报
回复
Sorry to disappoint you, but there is no way you can modify the source code of the ShellWindows object to list other windows.
TianChong 2006-03-08
  • 打赏
  • 举报
回复
老兄你能不能在中国的论坛上说中国话,实在BS你,以为会说点英文很了不起是吗?请有点中国人的骨气好不好?连母语都不屑多说的人,是背祖忘宗之辈,对不起本贴不欢迎你!!!!!!!!!!!!!
蒋晟 2006-03-08
  • 打赏
  • 举报
回复
It is your restriction of using IShellWindows, not mine.

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧