小弟被这个问题困了很久了,请达人指点一二。
我已经得到了IHTMLDocument2指针,根据它里面的方法可以得到Body,可是我想得到DIV,并根据DIV的属性来阻止它的显示(目的是拦截浮动窗口)问题:
1.我不知道怎么得到DIV
2.得到DIV以后我应该怎么修改它的属性。
我用以下方法尝试但不行。
// pDoc为IHTMLDocument2的指针
CComPtr<IHTMLElementCollection> spAll;
hr = pDoc->get_all(&spAll);
CComVariant varID = LPCOLESTR("div");
CComPtr<IDispatch> lpDisp;
long nlen;
spAll->get_length(&nlen);
CComPtr<IHTMLElement> item;
for ( int i = 0; i < nlen; ++i )
{
hr = spAll->item(varID, CComVariant(i), &lpDisp);
if ( SUCCEEDED(hr) && lpDisp != NULL ) // 在这里lpDisp永远都是NULL
{
hr = lpDisp->QueryInterface( /*IID_IHTMLElement,*/ &item );
if ( SUCCEEDED(hr) && item != NULL )
{
// 处理
}
}
}请高手指点

解决方案 »

  1.   

    用法错误,spAll->item的第一个参数一般用代表整数的索引,例如CComVariant((long)0),第二个参数可以随便设置,如果第一个参数用字符串,则不能用"div",这是标签名,字符串内容应该是id或者name属性值,比如<div id='abc'>或者<div name='abc'>。
    你上面的代码既然是放到循环里了,则应该用数字索引来检索:
    hr = spAll->item(CComVariant((long)i), CComVariant(), &lpDisp);
    CComQIPtr<IHTMLElement> spElement = lpDisp;
    CComBSTR tagName;
    spElement->get_tagName(&tagName);
    if (tagName == CComBSTR("DIV"))
    {
      // 现在如果需要更进一步定位,则按照需求来做,比如查看DIV的某个属性是否匹配,或者某个style属性是否匹配
    }如果div元素有ID或者NAME属性,那么定位方法不需要那么复杂,只需要调用
    IHTMLDocument2::QueryInterface --> IHTMLDocument3
    IHTMLDocument3::getElementById(L"someid", ...) --> IHTMLElement 在这里就能直接得到id='someid'的元素
      

  2.   

    varID应该是索引值或id属性或name属性值, 不是tag name
      

  3.   

    可是我在执行hr = spAll->item(varID, CComVariant(0), &lpDisp);这一句的时候有的时候会出错,有时就正常,错误提示是“iexplore.exe has triggered a breakpoint”
    请问这又是怎么回事?
      

  4.   

    那肯定就是这句话引发的中断,你看下&lpDisp值是什么,是空?还是什么呢?检查一下!
      

  5.   

    出错的问题目解决,原因是没有调用它的Release()方法。每得到一个指针后不用的时候调用它的lpDisp.Release();就没问题了
      

  6.   

    CComPtr<IDispatch> lpDisp;
    CComVariant varID(i);
    hr = spAll->item(varID, CComVariant(0), &lpDisp);
    CComPtr<IHTMLElement> item = lpDisp;
    使用这种方法得到一个DIV的IHTMLElement以后,使用item->put_outerHTML(L"");方法,但是在网页里面“查看-》源码”里面,这个DIV还是存在,我用什么方法可以把这个DIV删除
      

  7.   

    查看网页源码查看的是原始下载的网页内容,不是动态改变的内容,无论DOM发生了什么改变,查看源码总是不变的,但是浏览器显示的内容是DOM改变后的
      

  8.   

    jameshooo 
    --你好。
    现在我是在函数Invoke(。)的DISPID_DOCUMENTCOMPLETE事件时做的处理,可以拦截浮动窗口,但是有一种浮动窗口是在.js文件里面做的,像那样的浮动在DISPID_DOCUMENTCOMPLETE事件中拦截不了,请指点
      

  9.   

    比如太平洋网站http://www.pconline.com.cn/中右下角那个窗口就无法拦截,我查看了一下,它也是一个DIV,只不过它是在.js文件里面做的,请问我该怎么做也能拦截这样的窗口
      

  10.   

    比如太平洋网站http://www.pconline.com.cn/右下解的那个浮动窗口,我查看了一下,它也是一个DIV,只不过它是在.js文件里面写的,请问我该如何做连它也能拦截到
      

  11.   

    这是道魔相争,技术总在发展,没有一成不变的技术,也没有一招通杀的技巧,你只能完善你的拦截规则,通过添加规则的方式来增加拦截成功的概率。
    网页脚本可以使用定时器,在定时器中产生新的div是无法在DocumentComplete中捕获到的,当然你也可以使用定时器来扫描,见一个杀一个。