可以的话,希望给出示例。

解决方案 »

  1.   

    BOOL CXXXXApp::InitInstance()
    {
    //* プログラムの複数起動抑止
    HWND hWndCap,hWndPopup;
    CString strCaption;
    HANDLE hPrevMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,_T("h_XXXX_PrevInstance"));
    if(hPrevMutex)
    {
    CloseHandle(hPrevMutex);
    strCaption.LoadString(AFX_IDS_APP_TITLE);
    hWndCap = FindWindow(NULL,strCaption); if( hWndCap != NULL ){
    }
    return FALSE; }
    hExeCheckMutex = CreateMutex(FALSE,0,"h_XXXX_PrevInstance");
    return TRUE;
    }
    int CXXXXApp::ExitInstance()
    {
        ReleaseMutex(hExeCheckMutex);
        return CWinApp::ExitInstance();
    }
      

  2.   

    如果进程的主窗口一直存在的话,可以用FindWindow()来控制也比较简单
      

  3.   

    BOOL CNcApp::RunOne()
    {
    HANDLE hMap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,PAGE_READWRITE, 0, 128,"MutexNc"); 
    if(hMap==NULL)

    AfxMessageBox("创建用于互斥运行的内存映射文件对象失败!",MB_OK|MB_ICONSTOP); 
    return FALSE; 

    else if(GetLastError()==ERROR_ALREADY_EXISTS)
    {
    return false;
    HWND hWndPrevious=::FindWindow(NULL, "密码校验");
    if (hWndPrevious!=NULL) 

    // 主窗口已最小化,则恢复其大小 
    if (::IsIconic(hWndPrevious)) 
    ::ShowWindow(hWndPrevious,SW_RESTORE); 

    // 将主窗激活 
    ShowWindow(hWndPrevious,SW_SHOW);
    ::SetForegroundWindow(hWndPrevious); 

    // 将主窗的对话框激活 
    ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious)); 
    return false;

    // 退出本实例 


    else 

    LPVOID lpMem = MapViewOfFile(hMap, FILE_MAP_WRITE, 0,0,0); 
    strcpy((char*)lpMem, "程序正在运行!");
    UnmapViewOfFile(lpMem); 

    return true;
    }
      

  4.   

    在App的InitInstance中加入下代码HANDLE hSem = ::CreateSemaphore(NULL, 1, 1, _T("My Single Instance App"));if (::GetLastError() == ERROR_ALREADY_EXISTS)
    {
       ::AfxMessageBox(_T("该程序只能运行一个实例!"));
       return FALSE;
    }
      

  5.   

    HANDLE hEve = ::CreateEvent(NULL, 1, 1, _T("My Single Instance App"));if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
       AfxMessageBox(_T("该程序只能运行一个实例!"));
       return FALSE;
    }