就像Media Player一样?

解决方案 »

  1.   

    在App类InitInstance()函数的开头增加:
    CWnd *pOtherWnd = CWnd::FindWindow(NULL, "A2");//A2是主框架的标题
    if(pOtherWnd!=NULL)
    {
    AfxMessageBox("Program already running!");
    return FALSE;
    }
      

  2.   

    _hMutex=CreateMutex(NULL,FALSE,m_pAppName); //HANDLE m_hMutex;
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    {
    HWND hWnd=::FindWindow(NULL,m_pAppName);
    if(hWnd)
    {
    if(::IsIconic(hWnd))
    ::ShowWindow(hWnd,SW_RESTORE);
    ::SetForegroundWindow(hWnd);
    ::SetForegroundWindow(::GetLastActivePopup(hWnd));
    }
    else
    MessageBox(NULL,"您的程序已经运行了","提示信息",MB_ICONINFORMATION);
    return FALSE;
    }         //在 InitInstance 中,创建信号量:
    HANDLE hSem = CreateSemaphore(NULL,1,1,m_pszAppName);
    //信号量已存在?
    if(GetLastError() == ERROR_ALREADY_EXISTS)
    {
    //关闭信号量句柄
    CloseHandle(hSem);
    //寻找先前实例的主窗口
    HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
    while(::IsWindow(hWndPrevious))
    {
    //检查窗口是否有预设的标记?
    //有,则是我们寻找的主窗口
    if(::GetProp(hWndPrevious,m_pszAppName))
    {
    //主窗口已经最小化,则恢复其大小
    if(::IsIconic(hWndPrevious))
    ::ShowWindow(hWndPrevious,SW_RESTORE);
    //将主窗口激活
    ::SetForegroundWindow(hWndPrevious);
    //将主窗口对话框激活
    ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
    //退出本实例
    reture FALSE;
    }
    else
    //继续寻找下一个窗口
    hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT); }
    //前一实例已存在,但找不到其主窗口
    //可能出错了
    //退出本实例
    return FALSE;
    }
      

  3.   

    1.使用Mutex互斥变量
    2.使用Prop参加API函数SetProp就懂了
      

  4.   

    用Mutex就ok了~
    一个程序只能拥用一个Mutex~
      

  5.   

    那么我如何得到已经在运行实例中的数据呢?
    比如,已经运行了一个Pro.exe,其中有一个int,我运行第二个Pro.exe时,希望第二个Pro.exe在检测到已经有一个实例在运行以后,把那个实例中的int加一,然后第二个实例结束。
    再不用外部文件的前提下,能不能作到。
    谢谢。
      

  6.   

    InitInstance()里:HANDLE m_hMutex = CreateMutex(NULL,TRUE, m_pszAppName); 
    if(GetLastError() == ERROR_ALREADY_EXISTS) { return FALSE; }
      

  7.   

    InitInstance()里:HANDLE m_hMutex = CreateMutex(NULL,TRUE, m_pszAppName); 
    if(GetLastError() == ERROR_ALREADY_EXISTS) { return FALSE; }
      

  8.   

    其实可以做个共享dll,里面放一个变量,启动一次就+1,关闭就-1你就可以限制你开几个实例了。我这个方法是偏门,楼上几位大大得才是正道哟。