如果我一个程序已经启动了
再启动的时候,就提示我已经启动了,然后把启动的那个窗口正常的显示给我
如下一段代码,有时候好使
但是如果前面启动的那个程序被最小化成系统托盘了,这段程序就不能把它的窗口显示在前面了
关键是IsIconic是怎么农的呢?
我做系统的托盘的时候,好像没有碰到
            
string   proc=Process.GetCurrentProcess().ProcessName;
            MessageBox.Show(proc);
            Process[]   processes=Process.GetProcessesByName(proc);
            if (processes.Length > 1)
            {
                MessageBox.Show("程序已经启动!!", "Constants.MESSAGEBOX_TITLE");
                Process p = Process.GetCurrentProcess();
                int n = 0;
                if (processes[0].Id == p.Id)
                { n = 1; }                IntPtr hWnd = processes[n].MainWindowHandle;
                MessageBox.Show(hWnd.ToString());
                ShowWindowAsync(hWnd, SW_SHOWNORMAL);
                //if (IsIconic(hWnd))
                {
                    ShowWindowAsync(hWnd, SW_RESTORE);
                }                SetForegroundWindow(hWnd);                return;
            }

解决方案 »

  1.   

    这里有完整的解决方案,可供参考,
    基于.Net平台应用程序唯一运行实例实现,
    实现分析
    http://blog.csdn.net/zhzuo/archive/2006/06/30/857405.aspx
    源代码分析
    http://blog.csdn.net/zhzuo/archive/2006/07/04/874745.aspx
      

  2.   

    我觉得我的关键问题是SetForegroundWindow没有起作用
      

  3.   

    何必这么搞呢,直接在你的主窗体中定义一个消息,重写WndProc,在收到这小消息后还原不就行了
    这些
    MessageBox.Show(hWnd.ToString());
                    ShowWindowAsync(hWnd, SW_SHOWNORMAL);
                    //if (IsIconic(hWnd))
                    {
                        ShowWindowAsync(hWnd, SW_RESTORE);
                    }                SetForegroundWindow(hWnd);
    都不要了,写个PostMessage就行了