如何防止程序多个实例运行
也就是说,一个程序正在运行,那么我再点击该程序图标时,程序不再打开一个新的改程序进程。。

解决方案 »

  1.   

    1、在App类的InitInstance()函数头部增加语句:
        // 用应用程序名创建信号量
        HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);
        
        if(GetLastError() == ERROR_ALREADY_EXISTS)
        {
            CloseHandle(hSem);
            HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
            while(::IsWindow(hWndPrevious))
    {
    if(::GetProp(hWndPrevious, m_pszExeName))
                {
    if (::IsIconic(hWndPrevious))
    ::ShowWindow(hWndPrevious, SW_RESTORE);
                    ::SetForegroundWindow(hWndPrevious);
    ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
                    return FALSE;
    }
                hWndPrevious = ::GetWindow(hWndPrevious, GW_HWNDNEXT);
            } return FALSE;
        }
    2、在CMainFrame类的OnCreate(LPCREATESTRUCT lpCreateStruct)函数的return -1后面增加语句:
    ::SetProp(m_hWnd, theApp.m_pszExeName, (HANDLE)1);//做已启动标记;3、在CMainFrame类的OnDestroy()函数中增加语句:
    ::RemoveProp(m_hWnd, theApp.m_pszExeName); //删除已启动表记;就可以了
      

  2.   

    方法很多,常用的是: 程序开始创建一个有名事件. 如果返回已经存在,则退出,否则会创建成功.这是第一个实例. 这个事件保存下来,程序结束前CLOSE掉.
    其后运行的实例再次创建该同名的事件都会返回已经存在.HANDLE g_hEvent = NULL;
    BOOL CMyApp::InitInstance()
    {
    g_hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyEventName<<<><随便起的名字>>>><<><>");
    if (g_hEvent)
    {
    CloseHandle(g_hEvent);
    return FALSE;
    }         // ................
             // 其它代码}
    void CMyApp::ExitInstance()
    {
         CloseHadle(g_hEvent);
         CWinApp::ExitInstance();
    }
      

  3.   

    漏了一句: 执行其它代码前创建该事件
    g_hEvent = ::CreateEvent(0, TRUE, FALSE, "MyEventName<<<><随便起的名字>>>><<><>");
      

  4.   

    这样更好点,不用先打开,直接创建:g_hEvent = ::CreateEvent(0, TRUE, FALSE, "MyEventName<<<><随便起的名字>>>><<><>");if(GetLastError() == ERROR_ALREADY_EXISTS){
        //  已经存在的事件
        CloseHandle(g_hEvent);
        return FALSE;
    }
     // 做其它