今回は、アプリケーションの二重起動を防止する方法について説明します。この「起動されているかどうか」をどうやって特定するのかが重要になってきます。アプリケーションは、起動されると共にウインドウを作成します。アプリケーションは起動されているということになるでしょう。その結果がTRUEならば、アプリケーションを起動しなければよいということになります。ウインドウが存在するかどうかを調べるには、FindWindowを呼び出します。lpWindowName);lpClassNameは、探したいウインドウのクラス名を指定します。lpWinodwNameは、探したいウインドウのウインドウタイトルを指定します。存在しない場合はNULLが返ることになります。次に、FindWindowの呼び出しの例を示します。そのときは二重起動が発生したと認識し、適切な処理を行います。WinMainから制御を返すこととなり、アプリケーションは直ちに終了することになります。ユーザーの操作性を支援してもよいかもしれません。ウインドウが他のウインドウに隠れているならば、それを前面に持ってくるなど。作成されているウインドウがユーザーの注意を引き付ければ、その心配はありません。ウインドウが最小化しているかどうかは、IsIconicで確認できます。hWnd);hWndは、最小化しているかを調べるウインドウのハンドルを指定します。ウインドウが最小化している場合は、0以外の値が返ります。最小化している場合は、0が返ります。最小化されているウインドウを元に戻すには、OpenIconを呼び出します。hWnd);hWndは、元に戻したいウインドウのハンドルを指定します。元に戻すことができた場合は、0以外の値が返ります。ウインドウを前面に持ってくるには、SetForegroundWindowを呼び出します。hWnd);hWndは、フォアグラウンドにしたいウインドウのハンドルを指定します。ユーザーが作業中のウインドウのことです。単純に二重起動を防止するだけでなく、ユーザービリティの面も考慮しています。lParam);}二重起動を防止できているかを確認するには、アプリケーションを2回起動します。2回目の起動で新しくウインドウが作成されなかったら成功です。szAppNameの初期値は少し変更しています。なければSetForegroundWindowでウインドウをフォアグラウンドにします。WM_QUERYOPENの戻り値を利用すればOpenIconの動作を制御できます。0;WM_QUERYOPENで0を返した場合、ウインドウは最小化の状態から元に戻れません。ウインドウを元に戻してよいかの確認が可能となります。0以外の値を返した場合は、ウインドウは元のサイズに戻ります。DefWindowProcは、このメッセージでは常にTRUEを返します。この方法は場合によっては利用できないこともあります。ウインドウを作成しないようなアプリケーションは、その代表といえるでしょう。それをプログラムの起動時にオープンできるかどうかで二重起動を防止します。FindwWindowを使った方法と比べると若干、効率性に劣るといえるかもしれません。その手がかりに注目するFindWindowの方法は、単純ながら非常にスマートであるといえます。