BOOL bFound = FALSE;// Try to create a mutex with the app's name
HANDLE hMutexOneInstance = ::CreateMutex(NULL,TRUE,_T(AfxGetAppName()));// Already there...means that we are already running an instance
if(::GetLastError() == ERROR_ALREADY_EXISTS)
bFound = TRUE;// Release the mutex
if(hMutexOneInstance)
::ReleaseMutex(hMutexOneInstance);

解决方案 »

  1.   

    注册表项控制、互斥对象、原子、find window
    ......
      

  2.   

    我常用CreateFileMapping,将其用作共享内存,一个实例启动时可以将自己的HWND放到
    共享内存中,再次启动实例时可以从中取出HWND(不用遍历查找窗口了),发送一些自定义的消息。例如支持命令行参数:
     myapp /exit   (如果没有实例,则什么也不做,否则让活动的实例退出)
     myapp /restart(如果没有实例,则启动一个,否则让活动的实例重启动)
      

  3.   

    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
    CWnd *pPrevWnd = CWnd::GetDesktopWindow();
    pPrevWnd = pPrevWnd->GetWindow(GW_CHILD);
    while (pPrevWnd)
    {
    if (::GetProp(pPrevWnd->GetSafeHwnd(),m_pszExeName))
    {
    if (pPrevWnd->IsIconic())
    pPrevWnd->ShowWindow(SW_RESTORE);
    pPrevWnd->SetForegroundWindow();
    pPrevWnd->GetLastActivePopup()- >SetForegroundWindow();
    return FALSE;
    }
    pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT);
    }
    TRACE("Could not find previous instance main window! \n");
    return FALSE;
    }
    把这段代码加入app类的InitInstance()函数的::CreateMutex(NULL,TRUE,m_pszExeName);后面就行了
      

  4.   

    在CXXXApp.cpp中增加:
    #pragma data_seg("MyTest")
    Long g_lUsageCount=-1;
    #pragma data_seg
    #pragma comment(linker,"-section:MyTest,rws")
    然后,在InitInstance()中增加:
    CXXXApp::InitInstance() 
    {
    // 增加
        if((g_lUsageCount>=0) {
             AfxMessageBox("应用程序已经运行了");
             exit(0);
        }
        InterLockedIncrement(&g_lUsageCount);
    // Over
        ........
    }
    试一试吧。
      

  5.   

    marxshen的方法较为通用,不受窗口的限制,且也可用在非mfc程序中,建议使用之