你可以在CyouApp::InitInstance()中生成一个信号量,如果创建不成,用GetLastError()得知原因是
已经存在,则说明已有一个实例在运行,最好用m_szAppName来创建Semphore;至于找到实例,通过在Main frame 的构造函数中SetProp(),使你的程序有唯一标志,这样在发现有实例
运行时,通过检查Desktopwindow 的子窗口,找到运行实例的窗口句柄hwnd,用函数
SetForegoundWindow()使之为当前窗,在这之前检查是否最小化,如果是,还需ShowWindow()使之恢复
;最后在主窗口destroy之前,记得removeProp.
就这么简单,如果还有问题,到http://imrunning.yeah.net/给我留言或写信,我整理出你所需的代码,
不过我相信你不需要再来找我的,That is enough,OK?

解决方案 »

  1.   

    BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
    {
    TCHAR  buff[256];
    LPTSTR ptr;
    ::GetWindowText(hwnd,buff,sizeof(buff));
    if(lstrcmp(buff,WINDOW_TEXT)!=0)
    return TRUE;//continue to enum ptr=(LPTSTR)lParam;
    wsprintf(ptr,"%08lx",hwnd);
    return FALSE;
    }
    BOOL DoMultiInstanceTask(LPCTSTR filename)
    {

    TCHAR  chHwnd[256];
    HWND   hMainWnd,hPopupWnd;
    DWORD  dwThreadID;
    ::EnumWindows(EnumWindowsProc,(LPARAM)chHwnd);
    sscanf(chHwnd,"%08lx",&hMainWnd);
    if(!::IsWindow(hMainWnd)){
    AfxMessageBox("It is not a valid window.");
    return FALSE;//it will not reach here
    }
    hPopupWnd=::GetLastActivePopup(hMainWnd);
    ::SetForegroundWindow(hMainWnd);
    if(::IsIconic(hMainWnd))
    ::ShowWindow(hMainWnd,SW_SHOW);
    if(hPopupWnd!=hMainWnd)
    ::SetForegroundWindow(hPopupWnd);
    if(!RegFileName(hMainWnd,filename))
    return FALSE;
    dwThreadID=::GetWindowThreadProcessId(hMainWnd,NULL);
    if(dwThreadID>=0){
    while(!::PostThreadMessage(dwThreadID,WM_ME,0,0))
    ::Sleep(2);
    }
    return TRUE;
    }
      

  2.   

    if(FindWindow()){把前一个实例放在前面;自身结束;}
    继续