禁止一个实例多次运行知道怎么做,但问题是当实例最小化时,再运行一次,实例主窗口不会显示在桌面上,还是最小化的状态。就好像“我的电脑”一样,当有一个“我的电脑”的窗口时,再双击“我的电脑”,窗口再次变成当前窗口。请问怎么才能作到这一点,谢了。

解决方案 »

  1.   

    http://support.microsoft.com/kb/q243953/CreateMutex
      

  2.   

    在你的程序中处理一下,当发现以前的实例正在运行时,SendMessage给那个实例(进程),让它置前并设为活动的。
      

  3.   

    如果标题恒定 FindWindow
    否则 SetProp 设定某个标志
    GetProp + EnumWindow
      

  4.   

    SetForegroundWindow()    //改变Z-Order位置
    SetWindowLong()          //窗口类型设置为TOPMOST
      

  5.   

    关于这个问题有很多讨论了, 请看:
    http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=138321&forum_id=-1 
    http://vchelp.net/cndevforum/subject_view.asp?subject_id=23697&forum_id=59 
    http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=22474&forum_id=-1 
    http://vchelp.net/cndevforum/subject_view.asp?subject_id=22474&forum_id=-1 
    --------------
      

  6.   

    BOOL CHlloApp::InitInstance()
    {
      HANDLE hMutex=CreateMutex(null,TRUE,"MyHello");
      if (GetLastError()==ERROR_ALREADY_EXISTS)
        return FALSE;//退出
      
      ...
      ...
    }
      

  7.   

    const WM_MYMSG=WM_USER+100;//自定义消息BOOL CHlloApp::InitInstance()
    {
      HANDLE hMutex=CreateMutex(null,TRUE,"MyHello");
      if (GetLastError()==ERROR_ALREADY_EXISTS)
      {
        PostMessage(HWND_BROADCAST,WM_MYMSG,0,0);
        return FALSE;//退出
       }
      
      ...
      ...
    }
    //主窗口.h文件:
    //{{AFX_MSG(CADlg)
    //}}AFX_MSG
             afx_msg void OnMyMsg(WPARAM wp,LPARAM lp);//主窗口.cpp文件:
    BEGIN_MESSAGE_MAP(CADlg, CDialog)
    //{{AFX_MSG_MAP(CADlg)
    //}}AFX_MSG_MAP
             ON_MESSAGE(WM_MYMSG,OnMyMsg)
    END_MESSAGE_MAP()void CADlg::OnMyMsg(WPARAM wp,LPARAM lp)
    {
      ::SetWindowPos(this->m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    }