2重起動チェック後の既存アプリ制御について

[戻る]
ゆき [E-Mail] 2002/01/25(金) 17:05:43
はじめまして!現在、VC++6.0を始めました。
タイトルの内容について、教えて下さい。

2重起動のチェックについては、以下のようにコーディングしています。

m_hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, MutexNname);
if (m_hMutex) {        // 既存Mutex存在あり(ハンドル)
  CloseHandle(m_hMutex);
  ※
  return FALSE;
}

m_hMutex = CreateMutex(NULL, FALSE, MutexNname);
    
ここで、※の部分に追加したいのですが、既に起動されているプログラム
をアクティブにしたいのですが、教えて頂けますでしょうか?
(最小化されていれば、ウィンドウを元に戻すなど)

宜しく、お願いします。

NGA 2002/01/25(金) 18:04:55
ミューテックスオブジェクトは使わないんですが、こんなのも……。

HWND hFirsthWnd;
TCHAR szWndTitle[] = "Test";    // 自プログラムのタイトルバーのテキスト

if(hFirsthWnd = FindWindow(NULL, "Test"))
{
    SetForegroundWindow(hFirsthWnd);
    ShowWindow(hFirsthWnd, SW_SHOWNORMAL);
    return FALSE;
}

NGA 2002/01/25(金) 18:06:16
ちょっと修正……。

HWND hFirstWnd;
TCHAR szWndTitle[] = "Test";    // 自プログラムのタイトルバーのテキスト

if(hFirstWnd = FindWindow(NULL, "Test"))
{
    SetForegroundWindow(hFirstWnd);
    ShowWindow(hFirstWnd, SW_SHOWNORMAL);
    return FALSE;
}

kazuma 2002/01/25(金) 18:36:06
ふと思いついたのですが、
レジストリにウィンドウハンドルを書き込んでおくというのはどうでしょうか?
MFC だと簡単にレジストリを読み書きできますから。
単なる思いつきなので、何か問題点にお気づきの方はご指摘いただけるとありがたいです。

それと、
FindWindow の場合はウィンドウクラス名を独自のものにしておくとより確実だと思います。

EIJI 2002/01/25(金) 18:44:41
ファイルマッピングオブジェクトを利用した例です。
http://www.aa.wakwak.com/~dragoon/dual.htm

それからSetForegroundWindow()は、新しめのWindowsだと
タスクバーが点滅するだけで、手前に来てくれませんので注意。

最小化を元に戻すのは、
IsIconic()ならShowWindow( SW_RSTORE )で。

EIJI 2002/01/25(金) 18:45:37
SW_RESTOREでした

NGA 2002/01/25(金) 19:00:44
>ファイルマッピングオブジェクトを利用した例です。
ウィンドウハンドルを埋めておくというのは面白いですね。

ゆき [E-Mail] 2002/01/28(月) 15:03:23
[[解決]]
NGAさん、kazumaさん、EIJIさん、貴重な情報を提供して頂いて、ありがとうございました。
うまく、いきました。

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