如何在BHO的BeforeNavigate2事件中及时获得IE窗口URL?

huituer 2009-05-01 08:18:30
[背景]
测试网页:
URL1:http://www.x.x/test.html
test.html的内容是:<iframe src="URL2"></iframe>

BHO的要求: 当IE加载test.html时,会访问URL2,此时需要对比URL1和URL2,如果这两个URL的host不同,则阻断原IE窗口对这个iframe的加载,然后创建一个新的IE窗口去访问URL2。

[基本想法]
我在BHO中,对BeforeNavigate2事件进行处理。当BeforeNavigate2事件触发时会得到一个将要浏览的URL,只要拿到浏览器窗口的URL就可以进行判断。

[问题]
我首先尝试通过IEThis.LocationURL获得IE窗口的URL,但是后来发现:当iframe触发BeforeNavigate2事件时,URL1还没有被写到LocationURL中;
然后尝试通过IEThis.HWND句柄获取IE窗口的Edit组件中的值,测试结果证明,从Edit中拿到的值与LocationURL是一样的...;
后来在无奈之下尝试了DDE,这个倒是能及时获得窗口上的URL,但是会产生额外的浏览事件 -- IE会试图访问WWW_GetWindowInfo这个地址。

实在没辙了,向大家求教其它能够及时得到IE窗口的方法:-)
...全文
358 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
huituer 2009-05-02
  • 打赏
  • 举报
回复
get_LocationURL这个方法无法及时(在<iframe>触发BeforeNavigate2事件时)得到地址栏的URL

有一种解决方法是在DllMain中使用GetCommandLine得到命令行参数,第一个参数是IE的路径,第二个参数就是URL

但是,让这种方法凑效的前提是:每一个URL都要新建进程进行浏览。因为线程是没有命令行参数的。
不说害怕 2009-05-02
  • 打赏
  • 举报
回复
老题目,仍然关注,我也想知道解决方法.
agchen81 2009-05-01
  • 打赏
  • 举报
回复

试试
STDMETHODIMP CEyeOnIE::Invoke(DISPID dispidMember,
REFIID riid, LCID lcid,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pvarResult,
EXCEPINFO *pexcepinfo,
UINT *puArgErr)
{
USES_CONVERSION;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
UCHAR scuDisk = FALSE;
UCHAR keyFlag = FALSE;
CAffirmDlg dlg;
int nResponse = 0;

char sIeAddr [MAX_PATH]

if (!pDispParams)
return E_INVALIDARG;
switch (dispidMember)
{
case DISPID_BEFORENAVIGATE2:
{
LPOLESTR lpURL = NULL;
mWebBrowser2->get_LocationURL(&lpURL);
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
StrCpy(sIeAddr, OLE2A(varURL.bstrVal));// 地址
}

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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