the following code will click submit button of html page in IE, modify it to click other button. /////////////////////////////////////////////////////////////////////////////////////// //click submit button of IE window //If it works, it is written by masterz,otherwise I don't //know who writes it^_^ /////////////////////////////////////////////////////////////////////////////////////// void CGetIESrcDlg::NavigateToUrl() { // Import the following files in your stdafx.h // #import <mshtml.tlb> // Internet Explorer 5 // #import <shdocvw.dll> // Refer to "Connect to Internet Explorer Instances, From your own Process. " in www.codeguru.com SHDocVw::IShellWindowsPtr m_spSHWinds; CoInitialize(NULL); if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK) { IDispatchPtr spDisp; long nCount = m_spSHWinds->GetCount(); for (long i = 0; i < nCount; i++) { _variant_t va(i, VT_I4); spDisp = m_spSHWinds->Item(va); SHDocVw::IWebBrowser2Ptr spBrowser(spDisp); if (spBrowser != NULL) { IDispatchPtr spDisp; if(spBrowser->get_Document(&spDisp) == S_OK && spDisp!= 0 ) { MSHTML::IHTMLDocument2Ptr spHtmlDocument(spDisp); MSHTML::IHTMLElementPtr spHtmlElement; if(spHtmlDocument==NULL) continue; spHtmlDocument->get_body(&spHtmlElement); if(spHtmlDocument==NULL) continue; HRESULT hr; MSHTML::IHTMLElementCollection* pColl=NULL; hr=spHtmlDocument->get_all(&pColl); if(pColl!=NULL&&SUCCEEDED(hr)) { MSHTML::IHTMLElement* pElem=NULL; _variant_t index; index.vt=VT_I4; index.intVal=0; _variant_t name("Submit"); IDispatchPtr disp; disp=pColl->item(name,index); if(disp==NULL) hr=E_FAIL; else { hr=disp->QueryInterface(&pElem); } if (SUCCEEDED(hr)&& pElem != NULL) { // BSTR bstrhtml; pElem->get_outerHTML(&bstrhtml); CString str(bstrhtml); AfxMessageBox(str); pElem->click(); pElem->Release(); } pColl->Release(); } } } } } else { AfxMessageBox("Shell Windows interface is not avilable"); } CoUninitialize(); }
关注中!
///////////////////////////////////////////////////////////////////////////////////////
//click submit button of IE window
//If it works, it is written by masterz,otherwise I don't
//know who writes it^_^
///////////////////////////////////////////////////////////////////////////////////////
void CGetIESrcDlg::NavigateToUrl()
{
// Import the following files in your stdafx.h
// #import <mshtml.tlb> // Internet Explorer 5
// #import <shdocvw.dll>
// Refer to "Connect to Internet Explorer Instances, From your own Process. " in www.codeguru.com
SHDocVw::IShellWindowsPtr m_spSHWinds;
CoInitialize(NULL);
if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK)
{
IDispatchPtr spDisp;
long nCount = m_spSHWinds->GetCount();
for (long i = 0; i < nCount; i++)
{
_variant_t va(i, VT_I4);
spDisp = m_spSHWinds->Item(va);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if (spBrowser != NULL)
{
IDispatchPtr spDisp;
if(spBrowser->get_Document(&spDisp) == S_OK && spDisp!= 0 )
{
MSHTML::IHTMLDocument2Ptr spHtmlDocument(spDisp);
MSHTML::IHTMLElementPtr spHtmlElement;
if(spHtmlDocument==NULL)
continue;
spHtmlDocument->get_body(&spHtmlElement);
if(spHtmlDocument==NULL)
continue;
HRESULT hr;
MSHTML::IHTMLElementCollection* pColl=NULL;
hr=spHtmlDocument->get_all(&pColl);
if(pColl!=NULL&&SUCCEEDED(hr))
{
MSHTML::IHTMLElement* pElem=NULL;
_variant_t index;
index.vt=VT_I4;
index.intVal=0;
_variant_t name("Submit");
IDispatchPtr disp;
disp=pColl->item(name,index);
if(disp==NULL)
hr=E_FAIL;
else
{
hr=disp->QueryInterface(&pElem);
}
if (SUCCEEDED(hr)&& pElem != NULL)
{
//
BSTR bstrhtml;
pElem->get_outerHTML(&bstrhtml);
CString str(bstrhtml);
AfxMessageBox(str);
pElem->click();
pElem->Release();
}
pColl->Release();
}
} }
} }
else {
AfxMessageBox("Shell Windows interface is not avilable");
}
CoUninitialize();
}
我很少用MFC,我一般使用ATL和WTL编程。我觉得你可能采用的是WebBrowser控件,或者是基于HTML的视图。控件也好视图也好,它们都提供了一个Navigate方法,这个方法有一些参数,
object.Navigate( _
url As String, _
[Flags As Variant,] _
[TargetFrameName As Variant,] _
[PostData As Variant,] _
[Headers As Variant])
只要Postdata不为null,控件就会向远程的服务器发送HTTP的Post请求,请求的URL地址(Action=指出)赋值给url,PostData附提交的数据,对于提交的数据是有表单控件名称=表单控件值用&符号连接而成。为了准确的获得提交的字符串,你可以采用一些HTTP协议的跟踪工具比如EffeTech HTTP Sniffer,使用IE浏览要浏览网页,截获IE向远程服务器提交的数据,然后使用构造HTTP头赋值给Headers,不过你在构造HTTP协议头的时候,一定要熟悉HTTP协议。对于Get请求,Postdata可以为空。对于Postdata,除了设置Postdata之外,还要设置Headers域中的Content_length字段等于提交数据的长度。并设置提交数据的格式.这个过程与你使用Socket发送请求或者XMLHTTP组件发送请求方法完全一样。
下面是我编写的一个发送请求的片断供你参考:
int SendHTTPByIE(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength)
{
HRESULT hr;
USES_CONVERSION;
IWebBrowserApp* pWBApp = NULL; // Derived from IWebBrowser
BSTR bstrURL = NULL, bstrHeaders = NULL;
VARIANT vFlags = {0},
vTargetFrameName = {0},
vPostData = {0},
vHeaders = {0};
if (FAILED(hr = CoInitialize(NULL)))
{
return false;
}
if (FAILED(hr = CoCreateInstance(CLSID_InternetExplorer,
NULL,
CLSCTX_SERVER,
IID_IWebBrowserApp,
(LPVOID*)&pWBApp)))
{
goto Error;
}
bstrURL = SysAllocString(T2OLE(URL));
if (!bstrURL)
{
goto Error;
}
if(headers!=NULL){
bstrHeaders = SysAllocString(T2OLE(headers));
if (!bstrHeaders)
{
goto Error;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
}
if(Post!=NULL){
hr = GetPostData(&vPostData,(LPCTSTR)Post,postLength);
}
hr = pWBApp->Navigate(bstrURL, &vFlags,
&vTargetFrameName, &vPostData, &vHeaders);
pWBApp->put_Visible(VARIANT_TRUE);
Error:
if (bstrURL) SysFreeString(bstrURL);
if (bstrHeaders) SysFreeString(bstrHeaders);
if(Post!=NULL)VariantClear(&vPostData);
if (pWBApp){
pWBApp->Release();
pWBApp=NULL;
}
CoUninitialize();
return true;
}
HRESULT GetPostData(LPVARIANT pvPostData,LPCTSTR szPostData, DWORD postLength)
{
HRESULT hr;
LPSAFEARRAY psa;
LPSTR pPostData;
if (!pvPostData)
{
return E_POINTER;
}
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, postLength);
if (!psa)
{
return E_OUTOFMEMORY;
}
hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, szPostData, postLength);
hr = SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
return NOERROR;
}