关于IE编程的两个问题!请大家帮帮忙! 怎么才可以用程序实现向IE页面中的按钮发送被按下的消息呀?还有:怎么才可以用程序实现向IE的编辑框里写入字符串呢?大侠们帮帮忙!用VC实现!分不够再加! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /////////////////////////////////////////////////////////////////////////////////////////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();} 查询IHtmlFormElement接口,调用submit方法 xmlhttp或者创建IE对象直接发送HTTP 或者Post请求最好.这比模拟单击速度快的多. 如果你不知道发送Post或查Get的内容和格式,可以借助于Microsoft Application center Test获取。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}; __try{ 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:; } __finally{ 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; } 或者;int SendHTTPXML(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength,HTTPRequest* Buffer){ Buffer->dwSize =0; Buffer->dwHeadSize =0; Buffer->lpszResponseBody =NULL; Buffer->lpszResponseHeader =NULL; try { CoInitialize(NULL); MSXML::IXMLHttpRequestPtr pXH = NULL; HRESULT hr; if(FAILED(pXH.CreateInstance("Microsoft.XMLHTTP.1")))throw "Can not Create XMLHTTP Instance"; if(Post!=NULL){ hr=pXH->open(_bstr_t("POST"),_bstr_t(URL),CComVariant(VARIANT_FALSE),CComVariant(L""),CComVariant(L"")); if(FAILED(hr))throw "POST Error"; char *szBufferHeader=(char*)headers; char *szBufferLN; char *szComma; char szHeader[1024]; char szHeaderValue[1024]; if(headers!=NULL){ while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){ szComma=stristrA(szBufferHeader,": "); strncpy(szHeader,szBufferHeader,szComma-szBufferHeader); szHeader[szComma-szBufferHeader]=0; szBufferLN=stristrA(szComma,"\r\n"); strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma); szHeaderValue[szBufferLN-2-szComma]=0; hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue)); szBufferHeader=szBufferLN+2; } } hr=pXH->send(_variant_t((char*)Post)); if(pXH->status >=200 && pXH->status <400){ _bstr_t bstrResponseHeaders; _bstr_t bstrResponseText; bstrResponseHeaders=pXH->getAllResponseHeaders(); bstrResponseText=pXH->responseText; USES_CONVERSION; int nLen=bstrResponseHeaders.length(); Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1); ZeroMemory(Buffer->lpszResponseHeader,nLen+1); memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen); Buffer->dwHeadSize =nLen+1; nLen=bstrResponseText.length(); ZeroMemory(Buffer->lpszResponseBody,nLen+1); Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1); memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen); Buffer->dwSize=nLen+1; } } else { hr=pXH->open(_bstr_t(L"GET"),_bstr_t(URL),_variant_t(VARIANT_FALSE),_variant_t(L""),_variant_t(L"")); if(FAILED(hr))throw "POST Error"; char *szBufferHeader=(char*)headers; char *szBufferLN; char *szComma; char szHeader[1024]; char szHeaderValue[1024]; if(headers!=NULL){ while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){ szComma=stristrA(szBufferHeader,": "); strncpy(szHeader,szBufferHeader,szComma-szBufferHeader); szHeader[szComma-szBufferHeader]=0; szBufferLN=stristrA(szComma,"\r\n"); strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma); szHeaderValue[szBufferLN-2-szComma]=0; hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue)); szBufferHeader=szBufferLN+2; } } hr=pXH->send(); if(pXH->status >=200 && pXH->status <400){ _bstr_t bstrResponseHeaders; _bstr_t bstrResponseText; bstrResponseHeaders=pXH->getAllResponseHeaders(); bstrResponseText=pXH->responseText; USES_CONVERSION; int nLen=lstrlen(OLE2CT(bstrResponseHeaders)); Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1); ZeroMemory(Buffer->lpszResponseHeader,nLen+1); memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen); Buffer->dwHeadSize =nLen+1; nLen=lstrlen(OLE2CT(bstrResponseText)); Buffer->lpszResponseBody =(BYTE*) malloc( nLen+1); ZeroMemory(Buffer->lpszResponseBody,nLen+1); Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1); memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen); Buffer->dwSize=nLen+1; while(Buffer->lpszResponseBody[nLen-1]!='>')nLen--; Buffer->lpszResponseBody[nLen]=0; } } } catch(...) {//exception handling if(Buffer->lpszResponseBody!=NULL)free(Buffer->lpszResponseBody); if(Buffer->lpszResponseHeader!=NULL)free(Buffer->lpszResponseHeader); CoUninitialize(); return 1; } CoUninitialize(); return 0;} AnsiString __fastcall TForm3::Submit(void) { IHTMLDocument2 *pHTMLDoc = NULL; LPDISPATCH pDisp = NULL; pDisp =Web1->Document; if(pDisp) { if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHTMLDoc))) { pDisp->Release(); IHTMLElementCollection *pelement; if(pHTMLDoc->get_forms(&pelement)!=S_OK) { pHTMLDoc->Release(); pDisp->Release(); pelement->Release(); return "1发送失败"; } pDisp->Release(); tagVARIANT a,i; a.vt=VT_UI4; a.lVal=0;//这个值为你所要填写的表单在整个网页中的顺序,0为第一个表单 if(pelement->item(a,i,&pDisp)!=S_OK) { pelement->Release(); pDisp->Release(); return "2发送失败"; } pelement->Release(); IHTMLFormElement* pFormElem=NULL; if(pDisp) { if(!SUCCEEDED(pDisp->QueryInterface(IID_IHTMLFormElement,(LPVOID*)&pFormElem))) { pFormElem->Release(); pDisp->Release(); return "3发送失败"; } } else { return "31发送失败"; } pDisp->Release(); LPDISPATCH pDisp_msg = NULL; tagVARIANT phone,msg,empty; phone.vt=VT_UI4; phone.lVal=0;//这个值为Input框在表单中的顺序 msg.vt=VT_UI4; msg.lVal=1;//这个值为Text文本框在表单中的顺序 if((pFormElem->item(phone,empty,&pDisp)!=S_OK) ||(pFormElem->item(msg,empty,&pDisp_msg)!=S_OK)) { pFormElem->Release(); if(pDisp) pDisp->Release(); if(pDisp_msg) pDisp_msg->Release(); return "4发送失败"; } IHTMLInputTextElement* phoneElem=NULL; IHTMLTextAreaElement* msgElem; if(!pDisp||!pDisp_msg) return "11失败"; if (!SUCCEEDED(pDisp->QueryInterface(IID_IHTMLInputTextElement, (void**)&phoneElem)) ||(!SUCCEEDED(pDisp_msg->QueryInterface(IID_IHTMLTextAreaElement, (void**)&msgElem)))) { if(phoneElem) phoneElem->Release(); if(msgElem) msgElem->Release(); if(pDisp) pDisp->Release(); if(pDisp_msg) pDisp_msg->Release(); return "5发送失败"; } WideString s_phone,s_msg; s_phone="888888" s_msg="你好"; phoneElem->put_value(s_phone.c_bstr());//填写 msgElem->put_value(s_msg.c_bstr());//填写 pFormElem->submit();//提交 phoneElem->Release(); msgElem->Release(); pDisp->Release(); pDisp_msg->Release(); pFormElem->Release(); return "发送成功"; } } return "发送失败"; } 请教DirectUI的问题 ATL永久性的困惑! C++问题求助 请问如何得知指定路径的文件被关闭 请问要怎么修改输入法输入后的文字? 谁有《VISUAL C++MFC编程实例》和《VISUAL C++MFC扩展编程实例》的配套代码实例? 请问用LineTo时如何设置直线的颜色和粗细? 有关中间件 高分,有用就给分 关于CxImaged.dll的使用问题。求高人相助。 高手请再次顶力相助:如何删除CListCtrl的一整行? 亲爱的兄弟姐妹 们: 亲爱的兄弟姐妹们HELP
//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();
}
或者创建IE对象直接发送HTTP 或者Post请求最好.这比模拟单击速度快的多.
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};
__try{
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:;
}
__finally{
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;
} 或者;
int SendHTTPXML(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength,HTTPRequest* Buffer)
{ Buffer->dwSize =0;
Buffer->dwHeadSize =0;
Buffer->lpszResponseBody =NULL;
Buffer->lpszResponseHeader =NULL;
try
{
CoInitialize(NULL);
MSXML::IXMLHttpRequestPtr pXH = NULL;
HRESULT hr;
if(FAILED(pXH.CreateInstance("Microsoft.XMLHTTP.1")))throw "Can not Create XMLHTTP Instance";
if(Post!=NULL){
hr=pXH->open(_bstr_t("POST"),_bstr_t(URL),CComVariant(VARIANT_FALSE),CComVariant(L""),CComVariant(L""));
if(FAILED(hr))throw "POST Error";
char *szBufferHeader=(char*)headers;
char *szBufferLN;
char *szComma;
char szHeader[1024];
char szHeaderValue[1024];
if(headers!=NULL){
while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
szComma=stristrA(szBufferHeader,": ");
strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
szHeader[szComma-szBufferHeader]=0;
szBufferLN=stristrA(szComma,"\r\n");
strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
szHeaderValue[szBufferLN-2-szComma]=0;
hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
szBufferHeader=szBufferLN+2;
}
}
hr=pXH->send(_variant_t((char*)Post));
if(pXH->status >=200 && pXH->status <400){
_bstr_t bstrResponseHeaders;
_bstr_t bstrResponseText;
bstrResponseHeaders=pXH->getAllResponseHeaders();
bstrResponseText=pXH->responseText;
USES_CONVERSION;
int nLen=bstrResponseHeaders.length();
Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
Buffer->dwHeadSize =nLen+1;
nLen=bstrResponseText.length();
ZeroMemory(Buffer->lpszResponseBody,nLen+1);
Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);
Buffer->dwSize=nLen+1;
}
}
else
{
hr=pXH->open(_bstr_t(L"GET"),_bstr_t(URL),_variant_t(VARIANT_FALSE),_variant_t(L""),_variant_t(L""));
if(FAILED(hr))throw "POST Error";
char *szBufferHeader=(char*)headers;
char *szBufferLN;
char *szComma;
char szHeader[1024];
char szHeaderValue[1024];
if(headers!=NULL){
while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
szComma=stristrA(szBufferHeader,": ");
strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
szHeader[szComma-szBufferHeader]=0;
szBufferLN=stristrA(szComma,"\r\n");
strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
szHeaderValue[szBufferLN-2-szComma]=0;
hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
szBufferHeader=szBufferLN+2;
}
}
hr=pXH->send();
if(pXH->status >=200 && pXH->status <400){
_bstr_t bstrResponseHeaders;
_bstr_t bstrResponseText;
bstrResponseHeaders=pXH->getAllResponseHeaders();
bstrResponseText=pXH->responseText;
USES_CONVERSION;
int nLen=lstrlen(OLE2CT(bstrResponseHeaders));
Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
Buffer->dwHeadSize =nLen+1;
nLen=lstrlen(OLE2CT(bstrResponseText));
Buffer->lpszResponseBody =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseBody,nLen+1);
Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);
Buffer->dwSize=nLen+1;
while(Buffer->lpszResponseBody[nLen-1]!='>')nLen--;
Buffer->lpszResponseBody[nLen]=0;
}
}
}
catch(...)
{//exception handling
if(Buffer->lpszResponseBody!=NULL)free(Buffer->lpszResponseBody);
if(Buffer->lpszResponseHeader!=NULL)free(Buffer->lpszResponseHeader);
CoUninitialize();
return 1;
}
CoUninitialize(); return 0;
}