BOOL CMyApp::InitInstance()
{
::CreateMutex(NULL,FALSE,"MyApp1");
if(::GetLastError() == ERROR_ALREADY_EXISTS) return FALSE;

解决方案 »

  1.   

    BOOL InitInstance()
    {
        m_hMutex = ::CreateMutex(NULL,true,"test");
        if(GetLastError() == ERROR_ALREADY_EXISTS)
    return false;  //表明已经运行
        ReleaseMutex(m_hMutex);
    }
      

  2.   

    此程序中判断,
    app初始化实例的时候
    用FindWindow可以查当前运行程序类名或标题的名字,
    如果判断标题名字有重复的就可以返回了,例如
    CWnd *pWndPrev, *pWndChild;
    if (pWndPrev = CWnd::FindWindow(NULL,_T("***")))
    {
    pWndChild = pWndPrev->GetLastActivePopup();

    if (pWndPrev->IsIconic())
    pWndPrev->ShowWindow(SW_RESTORE);
    pWndChild->SetForegroundWindow();

    return FALSE;
    }如果是判断类名
    判断类名方法同上;
    AfxRegisterClass之前,为lpszClassName起一个名字;
    退出的时候用UnregisterClass;
      

  3.   

    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;
       HANDLE hMutex;    hInst = hInstance; 
       hMutex = CreateMutex(NULL,FALSE,"watchdog");
        if (WaitForSingleObject(hMutex,0) ==WAIT_TIMEOUT)
        {
            return FALSE;
        }
    ..
    }
      

  4.   

    用FindWindow有个毛病,就是当有一个explorer窗口(资源管理器)正好处在一个与这个程序名字相同的文件夹状态下时,也会认为是这个程序在运行。