如何定制一款12306抢票浏览器――实现自动查询和预定功能(三)
}
#endif
}
if ( FALSE == IsStopButtonExist(spDiv) ) {
hr = InsertStopButton(spDiv);
CHECKHR(hr);
#ifdef DEBUG
if ( FALSE == IsStopButtonExist(spDiv) ) {
DebugBreak();
}
#endif
}
} while (0);
return hr ;
}
[cpp]
HRESULT CDeal12306WebPage::GetInsertButtonElem( CComPtr & spForm,
CComPtr & spDiv )
{
HRESULT hr = E_FAIL;
do {
CComPtr spCx_TabDiv;
hr = GetElementByClassName(spForm, L"cx_tab", spCx_TabDiv);
CHECKHRPOINTER(hr, spCx_TabDiv);
hr = GetElementByIndex(spCx_TabDiv, 0, spDiv);
CHECKHRPOINTER(hr, spDiv);
} while (0);
return hr;
}
HRESULT CDeal12306WebPage::InsertStartButton( CComPtr & spElem )
{
HRESULT hr = E_FAIL;
do {
CComBSTR bstrWhere(L"beforeEnd");
CString cstrHTML;
cstrHTML.Format( BUTTONFORMAT, STARTBUTTONID, STARTCOMD, L"开始" );
CComBSTR bstrHTML(cstrHTML.GetString());
hr = spElem->insertAdjacentHTML( bstrWhere, bstrHTML );
CHECKHR(hr);
} while (0);
return hr ;
}
HRESULT CDeal12306WebPage::InsertStopButton( CComPtr & spElem )
{
HRESULT hr = E_FAIL;
do {
CComBSTR bstrWhere(L"beforeEnd");
CString cstrHTML;
cstrHTML.Format( BUTTONFORMAT, STOPBUTTONID, STOPCMD, L"停止" );
CComBSTR bstrHTML(cstrHTML.GetString());
hr = spElem->insertAdjacentHTML( bstrWhere, bstrHTML );
CHECKHR(hr);
} while (0);
return hr ;
}
[cpp]
#define BUTTONFORMAT L"
%s "
#define STARTBUTTONID L"StartButton"
#define STOPBUTTONID L"StopButton"
[cpp]
#define STARTCOMD L"http://www.12306.cn/mormhweb/kyfw/StartQuery.fl"
#define STOPCMD L"http://www.12306.cn/mormhweb/kyfw/StopQuery.fl"
当我们点击开始按钮是,页面将试图跳转到http://www.12306.cn/mormhweb/kyfw/StartQuery.fl,此时,我将终止该跳转,同时将“开启查询”标志设置为TRUE。
[cpp] view plaincopy
void CBrowserHost::BeforeNavigate2(IDispatch *pDisp, VARIANT *url,
VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData,
VARIANT *Headers, VARIANT_BOOL *Cancel)
{
do {
if ( NULL != url ) {
CString cstrUrl((LPWSTR)(url->bstrVal));
if ( 0 == cstrUrl.CompareNoCase(SETTINGOK) ) {
……
}
else if ( 0 == cstrUrl.CompareNoCase(STARTCOMD) ) {
*Cancel = VARIANT_TRUE;
m_AutoMan.SetStart(TRUE);
break;
}
else if ( 0 == cstrUrl.CompareNoCase(STOPCMD) ) {
*Cancel = VARIANT_TRUE;
m_AutoMan.SetStart(FALSE);
break;
}
}
*Cancel = VARIANT_FALSE;
} while (0);
}
点击停止按钮原理同点击开始按钮原理一致。此处不再赘述。
当用户选择好出发地和目的地及时间后,用户点击查询按钮。并点击“开始”按钮。我们的“人”线程就开始了自动查询操作。
查询是否存在票,有票则预定,无票则再次查询
当我们执行完一次查询后,我们要查看下搜索结果列表信息中用户选择的车次是否存在票。我们先看一下页面结构
其查找该节点的方法如下
[cpp]
HRESULT CDeal12306WebPage::QueryTicketsInfo( CComPtr & spDoc )
{
HRESULT hr = E_FAIL;
do {
CComPtr spMainDoc;
hr = GetMainDoc( spDoc, spMainDoc);
CHECKHRPOINTER(hr, spMainDoc);