在程序进入的时候也就是InitInstance中创建一个Mutex(互斥体),记得传入互斥体的名字,也就是调用CreateMutex,然后调用GetLastError,看看结果是不是ERROR_ALREADY_EXISTS,如果是的化结束程序(让InitInstance返回FALSE)

解决方案 »

  1.   

    if findwindow
     bringwindowtotop
     return false
    else
     ...
      

  2.   

    CreateMutex(...),CreateEvent(...)
    用这两个函数,很容易实现的.
      

  3.   

    以下代码供你参考:
    1、检查应用程序的其他实例是否启动:
    BOOL CTestApp::InitInstance()
    {
       //...
      ::CreateMutex(NULL,TRUE,m_pszExeName);
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    {
    //TODO:set focus to previous instance
    return FALSE;
    }
    2、实现寻找先前实例的代码
    BOOL CTestAPP::InitInstance()
    {
    ...
    ::CreateMutex(NULL,TRUE,m_pszExeName);
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    {
      CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD);
      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);
      }
       return FALSE:
    }
    ...
    pMainFrame->UpdateWindow();
    ::SetProp(pMainFrame->GetSafeHwnd(),m_pszExeName,(HANDLE)1);return TRUE;
    }
    3 删除先前的标示符 加进以下内容:
     
    void CMainFrame::OnDestory()
    {
       ::RemoveProp(GetSafeHwnd(),AfxGetApp()->m_pszExeName);
       CMDIFrameWnd::OnDestory();
    }
    这样做一定是可行的,我已经试过了。
    仅供参考程序代码来源于
       Visual C++ 4 开发人员指南
      

  4.   

    sorry:
    CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD);更正
    CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD);
      

  5.   

    CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHILD);
      

  6.   

    看这段代码:
    HANDLE hObject = CreateMutex(NULL,FALSE,"zhangmin");
    if(GetLastError() == ERROR_ALREADY_EXISTS)
    {
    CloseHandle(hObject);
    AfxMessageBox("程序已经运行!");
    return FALSE;
    }
      

  7.   

    下面代码没有调试,是刚写的,你去试看看:在InitInstance中:
    m_hMutex = ::CreateMutex(NULL,FALSE,"_name_you_define_");
    if( !m_hMutex )
      return FALSE;
    if( ::WaitForSingleObject( m_hMutex, 0 ) == WAIT_TIMEOUT )
      return FALSE;
    return TRUE;在ExitInstance中:
    ReleaseMutex( m_hMutex );
      

  8.   

    CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHILD);是什么意思?请赐教!!!谢谢!!
      

  9.   

    CWnd::GetDesktopWindow().GetWindow( GW_CHILD );
    // 获取桌面窗口的子窗口
      

  10.   

    http://www.csdn.net/develop/read_article.asp?id=10548
      

  11.   

    可以用FindWindow()来查看当前有没有指定的标题窗口,有就用AcitveWindow
    并CloseWindow当前窗口,没有就新增一个Create
      

  12.   

    1.在.h中声明一个private型变量:
       HANDLE m_hMutex;
    2.在InitInstance()的开始加上:
      CString strClassName="myproject";//用来识别是否已经运行的字符串
      m_hMutex=OpenMutex(MUTEXT_ALL_ACCESS,false,strClassName);
      if(m_hMutex==NULL)  //不存在,则创建并继续运行程序
         m_hMutex=CreateMutex(NULL,true,strClassName);
      else
        return false;  //停止运行
    3.在ExitInstance中,一定记住要把这个变量给销毁,否则,你不能再打开他了:
      if(m_hMutex!-NULL)
         ReleaseMutex(m_hMutex);
      

  13.   

    pMainFrame->UpdateWindow();中的pMainFrame没有定义,该怎么定义!