怎样得到0一个ie的IWebBrowser2实例! 好像是ole技术!msdn中写的可以用IWebBrowser2控制一个ie实例!有什么办法吗? 解决方案 » 免费领取超大流量手机卡,每月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();} //Get IHTMLDocument2 interface from HWNDIHTMLDocument2* GetDocInterface(HWND hWnd) { // 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); IHTMLDocument2* pDoc2=NULL; if ( hInst != NULL ){ if ( hWnd != NULL ){ CComPtr<IHTMLDocument> spDoc=NULL; LRESULT lRes; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") ); ::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") ); if ( pfObjectFromLresult != NULL ){ HRESULT hr; hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc); if ( SUCCEEDED(hr) ){ CComPtr<IDispatch> spDisp; CComQIPtr<IHTMLWindow2> spWin; spDoc->get_Script( &spDisp ); spWin = spDisp; spWin->get_document( &pDoc2 ); } } } ::FreeLibrary(hInst); } else{//如果没有安装MSAA AfxMessageBox(_T("请您安装Microsoft Active Accessibility")); } return pDoc2;} HOWTO: Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口)(http://support.microsoft.com/default.aspx?scid=kb;EN-US;q249232/*函数名:GetDocInterfaceByMSAA 参数:hwnd,WebBrowser控件的窗口句柄 功能:取得hwnd对应的Webbrowser控件的IHTMLDocument2*接口.*/IHTMLDocument2* GetDocInterfaceByMSAA(HWND hwnd){ HRESULT hr; HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); IHTMLDocument2* pDoc2=NULL; if ( hInst != NULL ){ if ( hwnd != NULL ){ //取得AccessibleObjectFromWindow函数 LPFNACCESSIBLEOBJECTFROMWINDOW pfAccessibleObjectFromWindow = (LPFNACCESSIBLEOBJECTFROMWINDOW)::GetProcAddress(hInst,_T("AccessibleObjectFromWindow")); if(pfAccessibleObjectFromWindow != NULL){ CComPtr spAccess; hr=pfAccessibleObjectFromWindow(hwnd,0, IID_IAccessible,(void**) &spAccess);//取得Webbrowser控件的IAccessible接口 if ( SUCCEEDED(hr) ){ CComPtr spServiceProv; hr=spAccess->QueryInterface(IID_IServiceProvider,(void**)&spServiceProv); if(hr==S_OK){ CComPtr spWin; hr=spServiceProv->QueryService(IID_IHTMLWindow2,IID_IHTMLWindow2, (void**)&spWin); /* 注意:并不是每次都能取得IHTMLWindow2接口,如果调用失败,可以尝试取得IHTMLElement接口: CComPtr spElement; hr=spServiceProv->QueryService(IID_IHTMLElement,IID_IHTMLElement,(void**)&spElement); */ if(hr==S_OK) spWin->get_document(&pDoc2); } } } } ::FreeLibrary(hInst); } else{ AfxMessageBox(_T("请您安装Microsoft Active Accessibility")); } return pDoc2;}void SetPassword(IHTMLDocument2 *pDoc2,POINT pt,CString strName){ if(pDoc2==NULL)return ""; CComPtr<IHTMLElement> pElement; HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement); if(SUCCEEDED(hr)){ CComPtr<IHTMLInputTextElement> pPwdElement; hr=pElement->QueryInterface(IID_IHTMLInputTextElement, (void**)&pPwdElement); if(SUCCEEDED(hr)){ CComBSTR type; hr=pPwdElement->get_type(&type); if(SUCCEEDED(hr)){ if(type==_T("password")){ CComBSTR pwd; hr=pPwdElement->put_value(strName); if(SUCCEEDED(hr)){ if(pwd.Length()!=0){ CComBSTR msg; msg=pwd; CString str(msg); return str; } else{ return ""; } } } } } } pDoc2->Release(); return ""; } 如何让几个Dialog同时显示? 接收到Socket视频数据包,如何实时播放呢? 切分窗口间如何传递消息? 如何判断BSTR类型变量是否为空? 用VC实现SVG查询的问题 比较字符串(包括字符串指针)大小 有几种 函数?? 如何快速判断一个连接是否已被关闭? 有关点右键在视图中弹出对话框的小问题 求助 列表框LBN_SELCHANGE的问题 在CEditView退出时,如何不让它弹出保存消息框(我不需要保存结果)? 可以实现吗:画一段任意弧线?
//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();
}
IHTMLDocument2* GetDocInterface(HWND hWnd)
{
// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
IHTMLDocument2* pDoc2=NULL;
if ( hInst != NULL ){
if ( hWnd != NULL ){
CComPtr<IHTMLDocument> spDoc=NULL;
LRESULT lRes; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL ){
HRESULT hr;
hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc);
if ( SUCCEEDED(hr) ){
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &pDoc2 );
}
}
}
::FreeLibrary(hInst);
}
else{//如果没有安装MSAA
AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
}
return pDoc2;
}
HOWTO: Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口)(http://support.microsoft.com/default.aspx?scid=kb;EN-US;q249232
/*函数名:GetDocInterfaceByMSAA
参数:hwnd,WebBrowser控件的窗口句柄
功能:取得hwnd对应的Webbrowser控件的IHTMLDocument2*接口.
*/
IHTMLDocument2* GetDocInterfaceByMSAA(HWND hwnd)
{
HRESULT hr;
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); IHTMLDocument2* pDoc2=NULL;
if ( hInst != NULL ){
if ( hwnd != NULL ){
//取得AccessibleObjectFromWindow函数
LPFNACCESSIBLEOBJECTFROMWINDOW pfAccessibleObjectFromWindow =
(LPFNACCESSIBLEOBJECTFROMWINDOW)::GetProcAddress(hInst,_T("AccessibleObjectFromWindow"));
if(pfAccessibleObjectFromWindow != NULL){
CComPtr spAccess;
hr=pfAccessibleObjectFromWindow(hwnd,0,
IID_IAccessible,(void**) &spAccess);//取得Webbrowser控件的IAccessible接口
if ( SUCCEEDED(hr) ){
CComPtr spServiceProv;
hr=spAccess->QueryInterface(IID_IServiceProvider,(void**)&spServiceProv);
if(hr==S_OK){
CComPtr spWin;
hr=spServiceProv->QueryService(IID_IHTMLWindow2,IID_IHTMLWindow2,
(void**)&spWin);
/*
注意:并不是每次都能取得IHTMLWindow2接口,如果调用失败,可以尝试取得IHTMLElement接口:
CComPtr spElement;
hr=spServiceProv->QueryService(IID_IHTMLElement,IID_IHTMLElement,(void**)&spElement);
*/
if(hr==S_OK)
spWin->get_document(&pDoc2);
}
}
}
}
::FreeLibrary(hInst);
}
else{
AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
}
return pDoc2;
}void SetPassword(IHTMLDocument2 *pDoc2,POINT pt,CString strName)
{
if(pDoc2==NULL)return "";
CComPtr<IHTMLElement> pElement;
HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);
if(SUCCEEDED(hr)){
CComPtr<IHTMLInputTextElement> pPwdElement;
hr=pElement->QueryInterface(IID_IHTMLInputTextElement,
(void**)&pPwdElement);
if(SUCCEEDED(hr)){
CComBSTR type;
hr=pPwdElement->get_type(&type);
if(SUCCEEDED(hr)){
if(type==_T("password")){
CComBSTR pwd;
hr=pPwdElement->put_value(strName);
if(SUCCEEDED(hr)){
if(pwd.Length()!=0){
CComBSTR msg;
msg=pwd;
CString str(msg);
return str;
}
else{
return "";
}
}
}
}
}
}
pDoc2->Release();
return "";
}