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

[戻る]
シアトルフレーム [E-Mail] 2000/08/24(木) 17:41:10
system関数でとあるアプリケーションを実行させたんですが、
プログラムが終了しても、そのとき立ち上がったDOSプロンプトが消えません。

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

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

HAL 2000/08/25(金) 16:46:47
自分の環境でも、ちょっと確認してみました。
環境は、WINDOWS2000、VC++ 6.0 Enterpriseです。

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

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

HAL 2000/08/28(月) 17:45:01
ちょっと暇があったので、アプリケーションを
起動して、終了させるサンプルを書いてみました。
役立つといいんですが。

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;
}

古いスレッドには追加発言できません。