アプリケーションの重複起動を抑止する

MFCアプリケーションを作成・ビルドして実行すると、デフォルトの状態では重複起動が可能です。テキストエディタなどであれば問題ないのですが、アプリケーションの種類によっては問題になることがあります。 重複起動を抑止するためには、CWinApp派生クラスのInitInstanceに下記のコードを追加します。

BOOL CSampleApp::InitInstance()
{
    // アプリケーションの重複起動防止
    ::CreateMutex(NULL, TRUE, _T("SampleApp"));
    if( GetLastError() == ERROR_ALREADY_EXISTS)
    {
        CString szTitle;
        szTitle.LoadString(AFX_IDS_APP_TITLE);  // AFX_IDS_APP_TITLEはウィンドウのタイトル
        CWnd* pWnd = CWnd::FindWindow(NULL, szTitle);  // 既に起動しているウィンドウを取得
        if (pWnd)
        {
            if (pWnd->IsIconic())  // 最小化されている?
            {
                pWnd->PostMessage(WM_SYSCOMMAND, SC_RESTORE);  //元のサイズに戻す
            }
            pWnd->SetForegroundWindow();  //ウィンドウをアクティブにする
        }
        return FALSE;
    }
}

これで、重複起動を抑止するとともに、既に起動されているウィンドウをアクティブにすることができます。