アプリケーションの複数起動を禁止する |
Mutexを使用する方法が多く紹介されていますが、ここではちょっと違った方法を紹介します。
Cで記述する場合にはよく使う方法ですが、FindWindowによって自アプリケーションの登録クラス名を検索し、見つかればすでに起動中と判断します。
このためには、MFCで作成した自アプリケーションのクラス名を独自に登録する必要があります。 以下はMDIアプリケーションの場合の例: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if ( !CMDIFrameWnd::PreCreateWindow( cs )) return ( FALSE ); // TODO: この位置で CREATESTRUCT cs を修正して、Window クラスやスタイルを // 修正してください。 // ウインドウクラス名とアイコンを独自のものに差し替える LPCSTR lpszNewName = "MyClassname"; HINSTANCE hInst = AfxGetInstanceHandle(); WNDCLASS wc; if ( !::GetClassInfo( hInst, lpszNewName, &wc )) { ::GetClassInfo( hInst, cs.lpszClass, &wc ); wc.lpszClassName = lpszNewName; wc.hIcon = ::LoadIcon( hInst, MAKEINTRESOURCE( IDR_MAINFRAME )); ::RegisterClass( &wc ); } cs.lpszClass = lpszNewName; return ( TRUE ); } BOOL CMyApp::Initinstance() { : (省略) // 多重起動の禁止 HWND hPrevwnd = ::FindWindow(( LPCTSTR )"MyClassname", NULL ); if ( hPrevwnd != NULL ) { if ( ::IsIconic( hPrevwnd )) ::OpenIcon( hPrevwnd ); ::BringWindowToTop( hPrevwnd ); // 自分自身はここで終了する return ( FALSE ); } : (省略) } |