如何获取IE地址栏句柄

来源:百度知道 编辑:UC知道 时间:2024/06/13 14:24:49
我在Windows Mobile平台写一个浏览器的插件,需要调整地址栏位置,在其右侧插入一icon,但总是无法获得地址栏的句柄。
我已尝试过利用EnumChildWindows来枚举子窗口,第一个参数为我通过IWebBrowser2接口得到的browser窗口的父窗口的父窗口,结果能够找到“Shell Embedding","AtlAxWin","MSIEMO Status",但偏偏找不到"combobox"和“Edit”。
另外,我感觉地址栏跟网页应该是作为一个整体的ActiveX控件,但当我试图移动上述获得的Browser窗口时,结果被移动的只有地址栏下的网页。再有,接口中微软也只提供了put_AddressBar跟get_AddressBar这两个地址栏方法,但它们只跟地址栏的显示与否有关。
不知可有高手能够指教一二?
我的代码是这样子的,麻烦帮忙看一下。
EnumChildWindows(GetParent(new_hwnd),(WNDENUMPROC)EnumProc,NULL);

BOOL CALLBACK EnumProc(HWND h, LPVOID Info)
{
void *szClassName;
szClassName = malloc(25*sizeof(WCHAR));
GetClassName(h, (LPWSTR)szClassName, 25);
if(wcsncmp(TEXT("Worker"), (wchar_t*)szClassName, sizeof(TEXT("Worker"))) == 0)
{
MessageBox(NULL,L"the child window is Worker control",(LPWSTR)szClassName,MB_ICONWARNING | MB_OK | MB_TOPMOST);

所有的IE都是在一个进程中不同的线程中运行的,所以用一般的方法是不太好用的,我以前也做了一个获取IE句柄的程序,不过是很久以前的事情了,凭记忆随便讲一下吧,可能还要你自己在去研究一下
1。在头文件中加入以下几行(我只稍稍试了试,没有做到底)
#include<commctrl.h>
#import"mshtml.tlb"
//或msthml.dll
#import"showcvw.dll"exclude("tagREADYSTATE")
2。用CoInitialize(NULL)与CoUninitalize()来初始化COM接口
3。IE未在运行对象表中注册,而是在ShellWindows中,声明以下变量用以得到ShellWindows对象
SHDocVw::IShellWindowsPtr spsWnds;
spsWnds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
if( NULL == spsWnds )
//没有Shellwindow启动,IE也就没运行了
long count = spsWnds->GetCount();
if( count<0 )
//没有Shellwindow启动,IE也就没运行了
//==0时有一个
4.获取一个IE窗口
IDispatchPtr spDisp;
long index; //从0到Count-1循环
_variant_t va(index , VI_I4 );
spDisp=spsWnd->Item( va );
SHDocVw::IWebBrowserzPtr spBrowser( spDisp );
if( NULL == spBrowser )
//无IE运行
得到IE后就可以用GetDocument与SetDocument等此类的函数来控制此IE了(很长时间了,有些什么函数也忘了,不过如果对VC与COM都较