检测某个程序是否已经运行,如果运行就切换到该程序界面

检测某个程序是否已经运行,如果运行就切换到该程序界面。
以下代码还存在一个问题,程序最小化之后就不能恢复了

 

/// 该函数设置由不同线程产生的窗口的显示状态  
        /// </summary>  
        /// <param name="hWnd">窗口句柄</param>  
        /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分</param>  
        /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零</returns>  
        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
        /// <summary>  
        ///  该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。  
        ///  系统给创建前台窗口的线程分配的权限稍高于其他线程。   
        /// </summary>  
        /// <param name="hWnd">将被激活并被调入前台的窗口句柄</param>  
        /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零</returns>  
        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
        /// 窗口是否已最小化        
       [System.Runtime.InteropServices.DllImport("User32.dll")]   
        private static extern bool IsIconic(IntPtr hWnd);
       [System.Runtime.InteropServices.DllImport("User32.dll")]
       private static extern bool OpenIcon(IntPtr hWnd);

       //相关常量        
        private const int SW_HIDE = 0;             //隐藏窗口,活动状态给另一个窗口       
        private const int SW_SHOWNORMAL = 1;       //用原来的大小和位置显示一个窗口,同时令其进入活动状态  
        private const int SW_SHOWMINIMIZED = 2;    //最小化窗口,并将其激活       
        private const int SW_SHOWMAXIMIZED = 3;    //最大化窗口,并将其激活      
        private const int SW_SHOWNOACTIVATE = 4;   //用最近的大小和位置显示一个窗口,同时不改变活动窗口      
        private const int SW_RESTORE = 9;          //用原来的大小和位置显示一个窗口,同时令其进入活动状态          
        private const int SW_SHOWDEFAULT = 10;     //根据默认 创建窗口时的样式 来显示  
        private static void HandleRunningInstance(Process instance)
        {
            IntPtr hWnd = instance.MainWindowHandle;
            bool isIcon = IsIconic(hWnd);             // 窗口是否已最小化       
            if (isIcon)           
            {             
                // 还原窗口           
                ShowWindowAsync(hWnd, SW_RESTORE);  
            }          
            else        
            {
                OpenIcon(hWnd);
                //如果期望窗口显示为Normal模式,可先做如下设置      
                ShowWindowAsync(hWnd, 10);      
                // 将窗口设为前台窗口             
                SetForegroundWindow(hWnd);       
            }
        }

        private void btn_Click(object sender, EventArgs e)
        {
            Process process = IsProcessStarted("F");
            if (process != null)
            {
                HandleRunningInstance(process);
               // System.Environment.Exit(1);
            }
            else
            {
                string tempPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "F.exe";
                if (File.Exists(tempPath))
                {
                    System.Diagnostics.Process.Start(tempPath);
                }
                else
                {
                    MessageBox.Show("未找到程序", "提示信息");
                }
            }
        }

        private Process IsProcessStarted(string processName)
        {
            Process[] temp = Process.GetProcessesByName(processName);
            if (temp.Length > 0)
            {
                return temp[0];
            }
            else
                return null;
        }

posted @ 2013-04-02 12:43  尹贝  阅读(550)  评论(0编辑  收藏  举报