systemで表示されたDOSプロンプトを消すには? – プログラミング – Home

systemで表示されたDOSプロンプ...
 
通知
すべてクリア

systemで表示されたDOSプロンプトを消すには?


シアトルフレーム
 シアトルフレーム
(@シアトルフレーム)
ゲスト
結合: 25年前
投稿: 1
Topic starter  

system関数でとあるアプリケーションを実行させたんですが、
プログラムが終了しても、そのとき立ち上がったDOSプロンプトが消えません。

環境はwin2000, VC++5.0です。win95で同じプログラムを実行させると
正常に消えてくれます。

解決法をご存知の方、御一報願います。


引用解決済
トピックタグ
HAL
 HAL
(@HAL)
ゲスト
結合: 25年前
投稿: 67
 

自分の環境でも、ちょっと確認してみました。
環境は、WINDOWS2000、VC++ 6.0 Enterpriseです。

system関数でDOSコマンドを実行してみましたが、
DOS窓はちゃんと消えました。
ということは、DOS窓が消えないというよりは、
外部起動したアプリケーション自体が終了して
いないということでしょう。この場合は当然
消えません。

もし、どうしても消したいのならばCreateProcessで
子プロセスを生成して、EnumWindowで子プロセスの
ハンドルを取得、そのハンドルを使って操作・・・、
これはちょっと面倒ですねえ・・・。


返信引用
HAL
 HAL
(@HAL)
ゲスト
結合: 25年前
投稿: 67
 

ちょっと暇があったので、アプリケーションを
起動して、終了させるサンプルを書いてみました。
役立つといいんですが。

STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;

BOOL bResult = CreateProcess(NULL, notepad.exe, NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

if ( bResult ) {
WaitForInputIdle( pi.hProcess, INFINITE );
EnumWindows( EnumWindowsProc, pi.dwProcessId );
CloseHandle( pi.hProcess );
}

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM dwProcessId)
{
DWORD lpdwProcessId = 0;
::GetWindowThreadProcessId(hWnd, &lpdwProcessId);

if ( (DWORD)dwProcessId == lpdwProcessId ) {
::PostMessage( hWnd, WM_CLOSE, 0, 0 );
return FALSE;
}

return TRUE;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました