多重起動の防止

今までのプログラムでは、アプリケーションを起動させている状態で
同じアプリを起動させようとすると、同じものを何個でも起動できました。
これはソフトによってはよい点でもあるのですが、ゲームなどでは必要ないですよね。
というかむしろ邪魔になります。
そこで、同じアプリは複数起動できないようにしてしまいましょう。

・同一名のアプリを最前面に

ソースを御用意しましたので、こちらをご覧ください。

前回のソースのWinMain関数内のRegisterClass関数の前に
以下の数行を付け足します。

     const TCHAR szAppName[] = _T("sample 04") ;
     HWND        hwnd ;
     MSG         msg ;
     WNDCLASS    wndclass ;

     //同じアプリケーション名のウィンドウがないか探す
     hwnd = FindWindow(szAppName,NULL); 
     if (hwnd){
          //最前面に持ってきて自分は終了する
          //SetForegroundWindow ((HWND)(((DWORD)hwnd) | 0x01));
          //SetForegroundWindow (hwnd);
          SetForegroundWindow((HWND)((ULONG) hwnd | 0x00000001));
          return 0;
     }

まずFindWindow 関数を使います。
FindWindowの第1引数にはウィンドウのクラス名を、
第2引数にはウィンドウ名(タイトルバーに表示されている文字列)を
指定しますが、第2引数はNULLでもいけるようです。
hwndに戻り値として、第1引数で指定しているクラス名のウィンドウが存在すれば
そのウィンドウのハンドルが、なければNULLが入ります。

FindWindow関数の戻り値hwndに値が入っていれば、
SetForegroundWindow 関数を使って指定したハンドルのウィンドウをアクティブにし、
最前面(1番手前)に持ってきてreturn0で抜け、終了します。
なければ通常通りの処理を続行します。
(引数の参考にいろんなソースを見ていたらhwndと|するというのがありました。
単純にhwndを入れるだけでもいけたのですが・・・よくわかりません)

HWND FindWindow (LPCSTR lpClassName , LPCSTR lpWindowName );
・指定したクラス名のウィンドウがないか探します
第一引数 lpClassName には、windowのクラス名を指定します
第二引数 lpWindowName には、windowのタイトルバー名を指定します

BOOL SetForegroundWindow (HWND hWnd );
・指定したウィンドウを最前面にもってきます
第一引数 hWnd には、windowのハンドルを指定します

2005/5/8


戻る