在VC里用webbrowser控件模拟自动点击按钮,有如下3种方法,但不是每时每刻都行的通的,哪种方便用哪种。
一、获取该按钮的网页元素接口,调用接口的click()函数
1.用httpWatch等工具获得该按钮的网页元素ID(strElementId)
2.获取网页元素集合,pRightDoc是该网页的文档接口
IHTMLElementCollection* pElemColl = NULL;
hr = pRightDoc->get_all( &pElemColl ); // 获取网页元素集合
void ButtonClick(IHTMLElementCollection * pElemColl, CString strElementId)
{
IDispatch *pDisp;
HRESULT hr;
VARIANT index;
VARIANT varID;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
varID = StringToVariant(strElementId);
hr = pElemColl->item(varID, index, &pDisp); // 获得按钮位置
if ( (hr == S_OK) && (pDisp != NULL) )
{
IHTMLElement* pElem = NULL; // 获得按钮元素接口
hr = pDisp->QueryInterface(IID_IHTMLElement, (void**)&pElem);
if ( (hr == S_OK) && (pElem != NULL) )
{
pElem->click(); // 点击按钮
pElem->Release();
}
pDisp->Release();
}
}
二、一般点击按钮后是为了执行一个JavaScipt函数,故可以直接执行该JavaScipt函数也可以达到点击按钮的效果。
1.用httpWatch等工具获得该网页的源码,如“确定”按钮的源码部分:
<input class="e_button" type="button" id="button_ok" name="button_ok"
value="确定" οnclick="jsFuction();" />
这样表明点击该按钮后执行jsFuction()函数。
CString strJsFuc = “jsFuction()”;
2.获得文档的父窗口接口,pRightDoc是该网页的文档接口
IHTMLWindow2* pWindow;
hr = pRightDoc->get_parentWindow(&pWindow);
void ExecJavascipt(IHTMLWindow2* pWindow, CString strJsFuc)
{
VARIANT ret;
ret.vt = VT_EMPTY;
BSTR bstrCode = strJsFuc.AllocSysString();
BSTR bstrLanguage = SysAllocString(L"javascript");
pWindow->execScript(bstrCode, bstrLanguage, &ret);
}
三、有些网页按钮还设置了快捷键,如按F2就表明点击该按钮,这样可以向该webbrowser控件发送F2键盘消息
1.获得webbrowser控件句柄
h_Wnd = ::FindWindow(NULL,"程序窗口标题");
HWND hShell = ::FindWindowEx(h_Wnd,NULL,"Shell Embedding",NULL);
HWND hView = ::FindWindowEx(hShell,NULL,"Shell DocObject View",NULL);
HWND hIEServer = ::FindWindowEx(hView,NULL,"Internet Explorer_Server",NULL);
2.发送F2键盘消息
::PostMessage(hIEServer,WM_KEYDOWN,VK_F2,0);
::PostMessage(hIEServer,WM_KEYUP,VK_F2,0);