会飞的木木 2019-02-19 16:13 采纳率: 0%
浏览 188

MFC 使用active插件 webbroswer 执行问题

void CtestwebbsrDlg::OnBnClickedButton1()
{   
    //获取WebBrowser的Document对象
        CComPtr<IHTMLDocument2> pDoc2 = xxxxxx;
        //查询IHTMLDocument3接口
        CComPtr<IHTMLDocument3> pDoc3 = NULL;
        pDoc2->QueryInterface(IID_IHTMLDocument3, (void **)&pDoc3);
        //用getElementsByTagName获取指定标签的所有元素
        CComPtr<IHTMLElementCollection> pCollection = NULL;
        pDoc3->getElementsByTagName((CComBSTR)_T("A"), &pCollection);
        long nCount = 0;
        pCollection->get_length(&nCount);//元素数量
        //循环,遍历所有元素
        CComPtr<IHTMLElement> pElement = NULL;
        for (long i = 0; i < nCount; i++)
        {
            _variant_t index = i;
            pCollection->item(index, index, &spDispatch);
            spDispatch->QueryInterface(IID_IHTMLElement, (void **)&pElement);
            if (pElement)
            {
                pElement->get_innerTEXT(&bstr);    //元素文本           
                CString strText = CString(bstr);
                if (strText == _T("离线下载"))//对比文本是不是我们要的
                {
                    //执行点击操作
                    pElement->click(); //  代码执行到这没有立即生效 页面没有反应
                }
                pElement.Release();
                pElement = NULL;
            }
            spDispatch.Release();
            spDispatch = NULL;
        }
        ....这里需要执行其他的一些操作
}// 这个按钮响应完全结束后 页面才开始执行 刚才的操作

我获取到一个按钮的IHTMLElement接口后,执行click操作,页面没有立即执行,等到btn整体执行后 才会执行,但是我还要执行其他的操作是建立在这个,按钮被点击之后基础上的,。
求大神指点指点

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 00:13
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在您的代码中,您尝试通过调用pElement.click()来触发按钮的点击事件。但是,在这个过程中,页面上的操作可能会导致按钮的行为延迟。要解决这个问题,您可以考虑使用Invoke()函数来直接调用按钮的方法,而不是直接调用其成员变量(例如点击方法)。以下是一个示例:

    void CtestwebbsrDlg::OnBnClickedButton1()
    {
        // 获取WebBrowser的Document对象
        CComPtr<IHTMLDocument2> pDoc2 = xxxxxx;
    
        // 查询IHTMLDocument3接口
        CComPtr<IHTMLDocument3> pDoc3 = NULL;
        pDoc2->QueryInterface(IID_IHTMLDocument3, (void **)&pDoc3);
    
        // 用getElementsByTagName获取指定标签的所有元素
        CComPtr<IHTMLElementCollection> pCollection = NULL;
        pDoc3->getElementsByTagName((CComBSTR)_T("A"), &pCollection);
    
        // 循环,遍历所有元素
        CComPtr<IHTMLElement> pElement = NULL;
        for (long i = 0; i < pCollection->length(); i++) 
        {
            // 获取当前元素的引用
            pCollection->item(i, i, &pElement);
    
            // 如果元素不为空,则调用其click方法
            if (pElement) 
            {
                // 调用Click方法
                pElement->click();
            }
    
            // 释放资源
            pElement.Release();
            pElement = NULL;
        }
    }
    

    这样做的好处在于,您不需要等待整个过程完成,而是可以即时执行后续的操作。

    评论

报告相同问题?