Last Updated 2004/02/26
Visual C++ MFC ウィンドウ
ウィンドウクラスの登録(多重起動防止)
2004/02/26

多重起動防止の策はいろいろあるが,その1つとしてウィンドウクラス名での防止を考える.


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    WNDCLASS c_wndclass;
    static char szMyClassName[] = "MyAppClass";

    GetClassInfo(AfxGetInstanceHandle(), "AfxFrameOrView", &c_wndclass);
    c_wndclass.lpszMenuName = NULL;
    c_wndclass.lpszClassName = szMyClassName;
    RegisterClass(&c_wndclass);
    cs.lpszClass = szMyClassName;

    return CFrameWnd::PreCreateWindow(cs);
}


メインフレームウインドウは cs.lpszClass の名前を持つ WNDCLASS 構造体の情報を元に作成されるから,cs.lpszClass の名前を変更するだけでは駄目で,その名前を持つ WNDCLASS 構造体をあらかじめ作成しておく必要がある.

"AfxFrameOrView" は WINCORE.CPP にて
  const char BASED_CODE _afxWndFrameOrView[] = "AfxFrameOrView";
このように定義してある.

多重起動は CWinApp::InitInstance() で調べる.


BOOL CFooApp::InitInstance()
{
    char szMyClassName[] = "MyAppClass";
    CWnd* pWnd;

    if(m_hPrevInstance) {
        pWnd = m_pMainWnd->FindWindow(szMyClassName, NULL);
        if(pWnd) {
            pWnd->IsIconic() ?
                pWnd->ShowWindow(SW_SHOWNORMAL) : pWnd->BringWindowToTop();
            return FALSE;
        }
    }
    ....
}


参照
多重起動防止
前後のTips
ウィンドウクラスの登録(多重起動防止)

DSS ProgrammingTipsCGI Ver1.02