代码在C++ builder测试过。
1. 获取IE软件的句柄
如果想获取其他软件的webbrowser,可以在这部分先获取其他软件的句柄。
HWND hWnd= FindWindow("IEFrame", NULL);
2. 获取IE软件浏览页的句柄
注意,这个可以用到获取其他软件内嵌的webbrowser句柄 。
HWND BrowserWnd=FindWithClassName( hWnd , _T("Internet Explorer_Server"));
HWND FindWithClassName(HWND ParentWnd,TCHAR* FindClassName)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
TCHAR ClassName[100]={0};
::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));
if (_tcscmp(ClassName,FindClassName)==0)
return hChild;
HWND FindWnd=FindWithClassName(hChild,FindClassName);
if (FindWnd)
return FindWnd;
}
return NULL;
}
3. 向IE发送WM_HTML_GETOBJECT消息获得对象
可能需要头文件:
#include
#pragma link "oleacc.lib"
代码:
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
HRESULT hr;
CComPtrspDoc;
HRESULT iResult=ObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
4. 获得IHTMLDocument2对象,对其进行操作。
//修改页面外观
spDoc->put_bgColor( CComVariant("red") );
//运行jscipt
IHTMLWindow2* sParentWindow = NULL;
spDoc->get_parentWindow(&sParentWindow);
if(sParentWindow!=NULL)
{
try
{
VARIANT vRet;
WideString str = "alert('Test');";
sParentWindow->execScript(str.c_bstr(), L"JScript", &vRet);
}catch(...)
{
ShowMessage("error sParentWindow");
}
}
//获得页面URL
BSTR bstrV = ::SysAllocString(L"");
spDoc->get_URL(&bstrV);
ShowMessage(bstrV);
SysFreeString(bstrV);
//获得页面内容
/* 获得type为“text” "password"的文本内容
获得name为“BTEST”的文本内容
TEST
*/
bool bFinded = false;
WCHAR wzEmailAddr[100] = {0};
WCHAR wzEmailPsw[100] = {0};
WCHAR wzTest[100] = {0};
CComPtr pAllColl;
HRESULT ihr_getAll = spDoc->get_all(&pAllColl);
if( SUCCEEDED(ihr_getAll) && pAllColl != NULL )
{
LONG length = 0;
ihr_getAll = pAllColl->get_length(&length);
ShowMessage(pAllColl->toString(""));
if (S_OK == ihr_getAll)
{
for(int i = 0; i < length; i++)
{
VARIANT vIndex,vName;
vName.vt = vIndex.vt = VT_I4;
vName.lVal = vIndex.lVal = i;
CComPtr pDisp;
ihr_getAll = pAllColl->item(vName,vIndex,&pDisp);
if (S_OK != ihr_getAll || pDisp == NULL)
{
continue;
}
CComPtr pElement;
ihr_getAll = pDisp->QueryInterface(IID_IHTMLInputTextElement,(void**)&pElement);
if (S_OK != ihr_getAll || pElement == NULL)
{
continue;
}
CComBSTR type;
hr = pElement->get_type(&type);
if(SUCCEEDED(hr))
{
if(type == "password")
{
CComBSTR pwd;
pElement->get_value(&pwd);
lstrcpyW(wzEmailPsw, (PWCHAR)pwd);
bFinded = true;
}
else if (type == "text")
{
CComBSTR eml;
pElement->get_value(&eml);
VARIANT AttrIndex;
AttrIndex.vt=VT_I4;
AttrIndex.lVal=4;
lstrcpyW(wzEmailAddr, (PWCHAR)eml);
bFinded = true;
}
}
CComBSTR name;
hr = pElement->get_name(&name);
if(SUCCEEDED(hr))
{
if(name == "BTEST")
{
CComBSTR value;
pElement->get_value(&value);
lstrcpyW(wzTest, (PWCHAR)value);
bFinded = true;
}
}
}
}
}
else ShowMessage(" get_all error ");
ShowMessage(wzEmailAddr);
ShowMessage(wzEmailPsw);
ShowMessage(wzTest);