note : Web browser

来源:互联网 发布:激活python2.7 知乎 编辑:程序博客网 时间:2024/06/09 22:30

用默认浏览器打开url

    BOOL OpenUrlOnDefaultBrowser(const WCHAR * pcUrl)    {        HINSTANCE       hRc = S_OK;        std::wstring    strParam = L"";        strParam = ns_base::StringFormatV(L"url.dll,FileProtocolHandler %s", pcUrl);        hRc = ShellExecuteW(            NULL,             L"open",             L"rundll32.exe",            strParam.c_str(),             NULL,             SW_SHOWNORMAL);        return ((int)hRc > 32);    }


ExecuteUrl

#include <windows.h>#include <tchar.h>#include <string>#include <exdisp.h>/// 按照给定的URL, 开一个浏览器窗口BOOL ExecuteUrl(WCHAR * pcUrl);int main(    HINSTANCE  hInstance,    HINSTANCE  hPrevInstance,      LPSTR  lpszCmdLine,    int  nCmdShow ){     ExecuteUrl(L"http://my.csdn.net/");    return 0; }BOOL ExecuteUrl(WCHAR * pcUrl){    HRESULT         hr = S_FALSE;    IWebBrowser2 *  pBrowser = NULL;    BSTR            bstrURL = NULL;    VARIANT         vEmpty;    if (NULL == pcUrl)        return FALSE;    if (FAILED(OleInitialize(NULL)))        return FALSE;    CoCreateInstance(        CLSID_InternetExplorer,         NULL,         CLSCTX_LOCAL_SERVER,         IID_IWebBrowser2,         (void**)&pBrowser);    if (NULL == pBrowser)        return FALSE;    VariantInit(&vEmpty);    bstrURL = SysAllocString(pcUrl);    hr = pBrowser->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);    if (SUCCEEDED(hr))    {        /// 只能是 VARIANT_TRUE, 填 VARIANT_FALSE 没效果        hr = pBrowser->put_Visible(VARIANT_TRUE);    }    else        pBrowser->Quit();    SysFreeString(bstrURL);    pBrowser->Release();    OleUninitialize();    return TRUE;}

遍历修改网页UI元素-文本

BOOL CWebPageAutoFill::fnWebPageAutoFill(){    /// 要填写元素都成功,才算成功    BOOL    bRc_MailBoxNamePrefix = FALSE;    BOOL    bRc_MailBoxNamePostfix = FALSE;    BOOL    bRc_MailBoxPwd = FALSE;    BOOL    bRc_MailBoxVerifyPwd = FALSE;    BOOL    bOK_Elem = FALSE;    BOOL    bOK_InputElem = FALSE;    long    lIndex = 0;    long    lLen = 0;    HRESULT hr = E_FAIL;    BSTR    bstrTagName = NULL;    BSTR    bstrClassName = NULL;    BSTR    bstrType = NULL;    BSTR    bstrName = NULL;    IDispatch *                 pDispatchHtmlDoc = NULL;    IDispatch*                  pElemDispatch = NULL;    IHTMLDocument2 *            pHtmlDoc = NULL;    IHTMLElementCollection *    pColl = NULL;    IHTMLElement *              pElem = NULL;    IHTMLInputElement *         pInputElem = NULL;    if (NULL == m_pWebBrowser)        goto _fnWebPageAutoFill_END;    // Retrieve the document object.    hr = m_pWebBrowser->get_Document(&pDispatchHtmlDoc);    if (FAILED(hr) || (NULL == pDispatchHtmlDoc))        goto _fnWebPageAutoFill_END;    hr = pDispatchHtmlDoc->QueryInterface(        IID_IHTMLDocument2,        (void**)&pHtmlDoc);    if (FAILED(hr) || (NULL == pHtmlDoc))        goto _fnWebPageAutoFill_END;    hr = pHtmlDoc->get_all (&pColl);    if (FAILED(hr) || (NULL == pColl))        goto _fnWebPageAutoFill_END;    // Obtained the Anchor Collection...    pColl->get_length (&lLen);    for (lIndex = 0; lIndex < lLen; lIndex++)    {        FreeBSTR(bstrTagName);        FreeBSTR(bstrClassName);        FreeBSTR(bstrType);        FreeBSTR(bstrName);        hr = pColl->item(            CComVariant(lIndex),             CComVariant(lIndex),             &pElemDispatch);        if (FAILED(hr) || (NULL == pElemDispatch))            goto _fnWebPageAutoFill_END;        hr = pElemDispatch->QueryInterface(            IID_IHTMLElement,            (void**)&pElem);        bOK_Elem = SUCCEEDED(hr);        hr = pElemDispatch->QueryInterface(            IID_IHTMLInputElement,             (void**)&pInputElem);        bOK_InputElem = SUCCEEDED(hr);        /// bBOK_strValue 是 FALSE, 因为文本没有值, 需要填充文本内容        /// 即使取COM元素成功, 得到的COM对象也有可能是空的        /// e.g. 取内容为空的文本输入框内的内容, 那个BSTR就是空的        if (bOK_Elem             && (NULL != pElem)            && bOK_InputElem            && (NULL != pInputElem))        {            hr = AutoFill_GetElement(pElem, bstrTagName, bstrClassName);            if (FAILED(hr))                continue;            hr = AutoFill_GetInputElement(pInputElem, bstrType, bstrName);            if FAILED(hr)                continue;            hr = AutoFill_MailBoxNamePerfix(                pInputElem,                 bstrTagName,                 bstrClassName,                 bstrType,                 bstrName);            if (SUCCEEDED(hr))            {                bRc_MailBoxNamePrefix = TRUE;                continue;            }            hr = AutoFill_MailBoxNamePostfix(                pInputElem,                 bstrTagName,                 bstrClassName,                 bstrType,                 bstrName);            if (SUCCEEDED(hr))            {                bRc_MailBoxNamePostfix = TRUE;                continue;            }            hr = AutoFill_MailBoxPwd(                pInputElem,                 bstrTagName,                 bstrClassName,                 bstrType,                 bstrName);            if (SUCCEEDED(hr))            {                bRc_MailBoxPwd = TRUE;                continue;            }            hr =  AutoFill_MailBoxVerifyPwd(                pInputElem,                 bstrTagName,                 bstrClassName,                 bstrType,                 bstrName);            if (SUCCEEDED(hr))            {                bRc_MailBoxVerifyPwd = TRUE;                break; ///< Web页面元素都填完了,跳出循环!            }        }    }_fnWebPageAutoFill_END:    FreeBSTR(bstrTagName);    FreeBSTR(bstrClassName);    FreeBSTR(bstrType);    FreeBSTR(bstrName);    if (NULL != pInputElem)        pInputElem->Release();    if (NULL != pElem)        pElem->Release();    if (NULL != pElemDispatch)        pElemDispatch->Release();    if (NULL != pColl)        pColl->Release();    if (NULL != pHtmlDoc)        pHtmlDoc->Release();    if (NULL != pDispatchHtmlDoc)        pDispatchHtmlDoc->Release();    /// 元素都填写成功了, 才算成功    return (bRc_MailBoxNamePrefix        && bRc_MailBoxNamePostfix        && bRc_MailBoxPwd        && bRc_MailBoxVerifyPwd);}

取网页元素值-文本

HRESULT CWebPageAutoFill::AutoFill_GetElement(    IHTMLElement * pElem,    BSTR & bstrTagName,    BSTR & bstrClassName){    HRESULT hr = E_FAIL;    bstrTagName = NULL;    bstrClassName = NULL;    if (NULL != pElem)    {        hr = pElem->get_tagName(&bstrTagName);        if (FAILED(hr) || (NULL == bstrTagName))            return E_FAIL;        hr = pElem->get_className(&bstrClassName);        if (FAILED(hr) || (NULL == bstrClassName))            return E_FAIL;    }    return S_OK;}HRESULT CWebPageAutoFill::AutoFill_GetInputElement(    IHTMLInputElement * pInputElem,    BSTR & bstrType,    BSTR & bstrName){    HRESULT hr = E_FAIL;    bstrType = NULL;    bstrName = NULL;    if (NULL != pInputElem)    {        hr = pInputElem->get_type(&bstrType);        if (FAILED(hr) || (NULL == bstrType))            return E_FAIL;        hr = pInputElem->get_name(&bstrName);        if (FAILED(hr) || (NULL == bstrName))            return E_FAIL;    }    return S_OK;}

元素值的比较和修改-文本

HRESULT CWebPageAutoFill::AutoFill_MailBoxNamePerfix(    IHTMLInputElement * pInputElem,    BSTR & bstrTagName,    BSTR & bstrClassName,    BSTR & bstrType,    BSTR & bstrName){    BSTR            bstrValue = NULL;    std::wstring    strMailBoxName;    std::wstring    strMailBoxPwd;    if ((NULL == pInputElem)        || (NULL == bstrTagName)        || (NULL == bstrClassName)        || (NULL == bstrType)        || (NULL == bstrName))    {        return E_FAIL;    }    /// 寻找邮箱名称    /// <input class="inputStyle" type="text" name="email"></input>    if ((0 == _tcsicmp(bstrTagName, L"input"))        && (0 == _tcsicmp(bstrClassName, L"inputStyle"))        && (0 == _tcsicmp(bstrType, L"text"))        && (0 == _tcsicmp(bstrName, L"email")))    {        /// 得到Web页面填充参数        GetParam_MailBoxReg(strMailBoxName, strMailBoxPwd);        /// 设置邮箱名称        bstrValue = SysAllocString(strMailBoxName.c_str());         pInputElem->put_value(bstrValue);        SysFreeString(bstrValue);        return S_OK;    }    return E_FAIL;}