WinXP pro IE7 VS2005 MFC
Macafee VirusScanインストール
こんにちは。
今、IE6で動いていたツールがIE7で動作せず困っています。
このツールはあるWEBページにあるCSVをダウンロードするのですが、
このWEBページは「https+電子証明書+認証カード+ActiveX?」が必要なため、
直接セッションの張るのをあきらめ、IEを外部から操作して
ダウンロードしています。
方法は、IEでダウンロードするときに表示される
「ダウンロードダイアログ」などのウインドウハンドルを見つけ、
各ボタンコントロールなどにクリックメッセージ等を送り、
人間が操作するのと同じ操作を再現するような形で、
実現しています。
現在、IE7ではCSVファイルをダウンロードするのか、
保存させるのかを選択させる「ダウンロードダイアログ」の
「保存ボタン」のウインドウハンドルを取得するところまではできています。
しかし、
(返り値はtrue)::PostMessage( /*「保存ボタン」のウインドウハンドル*/,
BM_CLICK, 0, 0 )
としてもクリック操作が行われず、先に進めません。
IE7だからなのか?そのほかの原因かは正確にはわかりませんが、
IE6では動作しています。
お力添えをお願いいたします。
--- 以下コード ----------------------------------------------------------------
/*_T(IE起動)*/
HRESULT hr = ::CoInitialize( NULL );
hr = pIE.CreateInstance( _T(InternetExplorer.Application) );
if( FAILED( hr ) ){
theApp.msg_error( _T(IE失敗));
return m_stepCount;
}
hr = pIE->put_Visible(true);
/*認証OK*/
/*ファイルのダウンロード*/
//URLを開く
COleVariant oleURL;
oleURL.SetString( ダウンロードしたいURL, VT_BSTR );
hr = pIE->Navigate2( oleURL );
if( FAILED( hr ) ){
buf.Format(_T(ファイルダウンロード失敗(Ooen URL Error)));
theApp.msg_error(buf);
return m_stepCount;
}
this->SetProgPos();
//ページ表示完了を待つ
VARIANT_BOOL pBusy;
CWnd* pWndDlDlg = NULL;
Sleep(1000);
do{
hr = pIE->get_Busy( &pBusy );
if( FAILED( hr ) ){
buf.Format(_T(ファイルダウンロード失敗(Time Out Error)));
theApp.msg_error(buf);
return m_stepCount;
}
//ダウンロードダイアログの検出
pWndDlDlg = CWnd::FindWindow( NULL, _T(ファイルのダウンロード) );
if( pWndDlDlg ){
#pragma warning ( disable: 4312 )
if( pWndDlDlg->GetParent()->m_hWnd == reinterpret_cast<HWND>(
pIE->GetHWND() ) ){
break;
}
#pragma warning ( default: 4312 )
}
this->SetActiveWindow();
this->SetForegroundWindow();
pWndDlDlg = NULL;
Sleep(500);
}while( pBusy == VARIANT_TRUE );
//ソースの続き
//ダウンロードダイアログの検出の確認
if( !pWndDlDlg ){
buf.Format(_T(ファイルダウンロード失敗(Do Not Start Download File Error)));
theApp.msg_error(buf);
return m_stepCount;
}
//保存ボタンハンドル取得 Time Out : 5sec
HWND hBtn = NULL;
for( int idx = 0; idx < 10 * 5/*sec*/; idx++ ){
hBtn = ::GetDlgItem( pWndDlDlg->m_hWnd, 0x1148 );
if( hBtn ){ break;}
Sleep( 100 );
}
//保存ボタンハンドル取得確認
if( !hBtn ){
buf.Format(_T(ファイルダウンロード失敗(Do Not Get Save Button Handle Error)));
theApp.msg_error(buf);
return m_stepCount;
}
//保存ボタン押下 Time Out : 30sec
HWND hBtnPostChk = NULL;
for( int idx = 0; idx < 2 * 30/*sec*/; idx++ ){
::SetActiveWindow( pWndDlDlg->m_hWnd );
::SetForegroundWindow( pWndDlDlg->m_hWnd );
::SetFocus( pWndDlDlg->m_hWnd );
Sleep( 400 );
if( !::PostMessage( hBtn, BM_CLICK, 0, 0 ) ){
//ココは通らない
TCHAR cBuf[1024];
CToolKit::GetFormatMessage( ::GetLastError(), cBuf, 1024);
buf.Format(_T(保存ボタンクリックメッセージ送信失敗[%s]), cBuf );
theApp.msg_debug(buf);
}
//保存ボタンが消える=ファイルのダウンロードダイアログがひらく
hBtnPostChk = ::FindWindowEx( pWndDlDlg->m_hWnd, NULL, _T(Button), _T(保
存(&S)) );
if( !hBtnPostChk ){
break;
}
Sleep( 100 );
}
//保存ボタン押下確認
if( hBtnPostChk ){
//
// ここで終了する 保存ボタンにクリックメッセージを送っても
// ファイルダウンロードダイアログが消えていない
//
buf.Format(_T(ファイルダウンロード失敗(Do Not Post Click Message To Save
Button Error)));
theApp.msg_error(buf);
return m_stepCount;
}
//ファイルの保存先設定ダイアログハンドル取得 Time Out : 5sec
HWND hFileNameDlg = NULL;
CString title;
for( int idx = 0; idx < 10 * 5/*sec*/; idx++ ){
hFileNameDlg = ::FindWindow( _T(#32770), _T(名前を付けて保存) );
if( hFileNameDlg ){
HWND hPare = ::GetParent( hFileNameDlg );
if( hPare ){
CWnd wndPare;
if( wndPare.Attach( hPare ) ){
wndPare.GetWindowText( title );
wndPare.Detach();
if( title == _T(ファイルのダウンロード) ){
break;//ファイルの保存先設定ダイアログハンドル検出
}
}
}
}
Sleep( 100 );
}
//ファイルの保存先設定ダイアログハンドル取得確認
if( title != _T(ファイルのダウンロード)){
buf.Format(_T(ファイルダウンロード失敗(Do Not Get Download Dialog Handle
Error)));
theApp.msg_error(buf);
return m_stepCount;
}
・・・・・
1行おきになってて読みにくいな
改行が大量に入り、読みにくくなってしまいました。
以下に修正して再投稿いたしましたので、
そちらのほうをご参照ください。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200902/09020010.txt