多重起動チェッククラス

HomeC++ Class Library[LIB-004]

 ダウンロード : AppCheck.zip (2005/05/28) 

常駐系ソフトの場合、多重起動すると困ることが多いです。
ミーテックスオブジェクトを使って先に起動したアプリの存在を知ることまでは、
インターネットで調べるとよくヒットします。

ところで、その、先に起動しているアプリにメッセージ通信したい場合はどうすればよいのでしょうか。
そこで使用するのが Win32SDK Tips の SDK-005 で使用したプロパティリストです。
このプロパティリストにウィンドウハンドルを追加して、
ウィンドウ列挙の結果と照合すれば、目的のウィンドウハンドルを取得できます。

これら一連の動作をクラスとしてまとめました。
それが今回紹介する CAppCheck クラスです。

使い方

  1. グローバルオブジェクトとして宣言する

    少しでも早いタイミングでミューテックスオブジェクトを登録させるため、
    出来る限りグローバルオブジェクトとして登録してください。

    なお、識別子として適当な文字列をご用意ください。
    なるべく自分のアプリだけが使用するような名称を使用してください。


    // グローバルオブジェクト
    CAppCheck g_check(_T("ValgusSampleApplication"));


  2. 最初の起動か確認する。

    IsFirst() メソッドにて最初の起動かどうかをチェックできます。
    結果が 0 以外なら最初の起動です。結果が 0 (FALSE)なら、既に起動しているアプリがあります。


        if (!g_check.IsFirst()){
            // 既に起動しているアプリがあります。
        }


  3. 自分のウィンドウハンドルを登録する

    もし、後から起動してくるアプリに自分のウィンドウハンドルを知らせたい場合は、
    RegistHWnd() メソッドを使って自分のハンドルを登録します。
    登録はウィンドウハンドルが出来てからになりますので、OnCreate() メソッドか、
    または、InitInstance の m_pMainWnd 取得直後がよいでしょう。


        m_pMainWnd = new CMyWnd();
        g_check.RegistHWnd(m_pMainWnd->GetSafeHwnd());


    登録するウィンドウハンドルは何度でも書き換えることが出来ます。
    通知するウィンドウハンドルを適宜変更したい場合は、
    その都度、RegistHWnd() メソッドを使って書き換えてください。

    なお、起動確認してからハンドル登録までの間にウィンドウハンドルの取得をされた場合、
    正しくハンドルが取れません。これは、仕様とさせていただきます。

  4. 先に起動したアプリのウィンドウハンドルを取得する

    GetAlreadyWindow() メソッドを使うことで
    先に起動したアプリが RegistHWnd()メソッドで登録したウィンドウハンドルを取得することが出来ます。
    WM_APP 等のプログラマが自由に使うことが出来るウィンドウメッセージを利用して、
    先に起動したアプリに通信して挙動をコントロールするなどに利用できます。


    #define WM_APP_SAMPLE   (WM_APP + 1)

        if (!g_check.IsFirst()){                            // 起動済みアプリがあれば
            HWND hWnd = g_check.GetAlreadyWindow();         // そのハンドルを取得して
            if (hWnd)                                       // 取得に成功したら
                ::PostMessage(hWnd, WM_APP_SAMPLE, 0, 0);   // メッセージを送る
            return;                                         // 処理を中断する
        }


    ※ GetAlreadyWindow() で正しく hWnd が取得できないことがあります。
    ※ 先の仕様に関係します。


 Copyright 2005 VALGUS. All Rights Reserved.