用默认浏览器打开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;}