只运行一个实例,后开启的同实例启动即关闭。在关闭之前,还要通知原来已运行的进程,让它显示或做其他事情,应该怎么做?

解决方案 »

  1.   


    #include <windows.h>
    #include <iostream.h>DWORD WINAPI Fun1Proc(
      LPVOID lpParameter   // thread data
    );DWORD WINAPI Fun2Proc(
      LPVOID lpParameter   // thread data
    );int tickets=100;
    HANDLE g_hEvent;void main()
    {
    HANDLE hThread1;
    HANDLE hThread2;
    // g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    // g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
    g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets");
    if(g_hEvent)
    {
    if(ERROR_ALREADY_EXISTS==GetLastError())
    {
    cout<<"only one instance can run!"<<endl;
    return;
    }
    } hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    SetEvent(g_hEvent); Sleep(4000);
    CloseHandle(g_hEvent);
    }DWORD WINAPI Fun1Proc(
      LPVOID lpParameter   // thread data
    )
    {
    while(TRUE)
    {
    WaitForSingleObject(g_hEvent,INFINITE);
    // ResetEvent(g_hEvent);
    if(tickets>0)
    {
    Sleep(1);
    cout<<"thread1 sell ticket : "<<tickets--<<endl;
    SetEvent(g_hEvent);
    }
    else
    {
    SetEvent(g_hEvent);
    break;
    }
    }

    return 0;
    }DWORD WINAPI Fun2Proc(
      LPVOID lpParameter   // thread data
    )
    {

    while(TRUE)
    {
    WaitForSingleObject(g_hEvent,INFINITE);
    // ResetEvent(g_hEvent);
    if(tickets>0)
    {
    Sleep(1);
    SetEvent(g_hEvent);
    cout<<"thread2 sell ticket : "<<tickets--<<endl;
    }
    else
    {
    SetEvent(g_hEvent);
    break;
    }
    }

    return 0;
    }在这个里面在发个消息就可以实现了
    if(ERROR_ALREADY_EXISTS==GetLastError())
    {
    cout<<"only one instance can run!"<<endl;
    return;
    }
      

  2.   


    hEvent=::CreateEvent(NULL,FALSE,FALSE,"你的标识符");
    //表示已经存在
    if(hEvent!=NULL && (GetLastError()==ERROR_ALREADY_EXISTS))
    {
            }
      

  3.   

    XXXApp::InitInstance()
    CWnd * pWnd = NULL;
    pWnd = CWnd::FindWindow(NULL, "窗体标题");
    if (pWnd) {

    SetForegroundWindow(pWnd->m_hWnd );
    BringWindowToTop(pWnd->m_hWnd );
    //向它发消息           。。          return false;

    }
      

  4.   


     hEvent=::CreateEvent(NULL,FALSE,FALSE,"你的标识符");
    //表示已经存在
    if(hEvent!=NULL && (GetLastError()==ERROR_ALREADY_EXISTS))
    {
           HWND hWnd = FindWindow("窗口类名",NULL);
    if(hWnd!=NULL)
    {
    ShowWindow(hWnd,SW_SHOWNORMAL);
    SetForegroundWindow(hWnd);
    SetActiveWindow(hWnd);
    }
    CloseHandle(hEvent);
    return FALSE;
    }
      

  5.   

    http://www.vckbase.com/document/viewdoc/?id=672
    非常详细,比CreateEvent那种方法要好,记得结账哦
      

  6.   

    Finwindow()
    发送消息 或者给它焦点。
    然后新的工程再悄悄的退出
      

  7.   

    谢谢大家的建议,我还是使用的是FindWindow方法,当然前提是给我的主对话框注册一个类名,这样按类名查找到窗口指针,再让它显示,感觉这样好一点。结贴了。