C# WinForm 只允许运行一个实例 ,如果有就激活到前段

来源:互联网 发布:网络当红女主播视频 编辑:程序博客网 时间:2024/05/22 13:40

http://blog.sina.com.cn/s/blog_45eaa01a01013ofh.html

C# WinForm 如果已经有其实例在运行,再运行新的实例就只闪一下屏幕,什么也看不到,导致不知所错。其实它的实例已经在“任务管理器”中,如果想结束它,可以按以下三个组合键 Ctrl + Alt + Del,点击其中的“任务管理器”进入Windows任务管理器,再点击“进程”页面,点选你的进程,再按“结束进程”将其结束。

  以下代码只允许 C# WinForm 运行一个实例 ,如果已经有其实例在运行,就将其窗口激活到前段显示。

主要代码如下:

using System;using System.Collections.Generic;using System.Windows.Forms;//只运行一个实例using System.Diagnostics;using System.Runtime.InteropServices;using System.Reflection;namespace WindowsApplication10{    static class Program    {        /// <summary>        /// 应用程序的主入口点。        /// </summary>        [STAThread]        static void Main()        {            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false); //1.这里判定是否已经有实例在运行            //只运行一个实例            Process instance = RunningInstance();            if (instance == null)            {                //1.1 没有实例在运行                Application.Run(new Form1());            }            else            {                //1.2 已经有一个实例在运行                HandleRunningInstance(instance);            }         }//2.在进程中查找是否已经有实例在运行        #region  确保程序只运行一个实例        private static Process RunningInstance()        {            Process current = Process.GetCurrentProcess();            Process[] processes = Process.GetProcessesByName(current.ProcessName);            //遍历与当前进程名称相同的进程列表             foreach (Process process in processes)            {                //如果实例已经存在则忽略当前进程                 if (process.Id != current.Id)                {                    //保证要打开的进程同已经存在的进程来自同一文件路径                    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\") == current.MainModule.FileName)                    {                        //返回已经存在的进程                        return process;                    }                }            }            return null;        }//3.已经有了就把它激活,并将其窗口放置最前端        private static void HandleRunningInstance(Process instance)        {            MessageBox.Show("已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);            ShowWindowAsync(instance.MainWindowHandle, 1);  //调用api函数,正常显示窗口            SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端        }        [DllImport("User32.dll")]        private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);        [DllImport("User32.dll")]        private static extern bool SetForegroundWindow(System.IntPtr hWnd);        #endregion     }}

其他方法:

using System; using System.Collections.Generic; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; using System.Reflection;  namespace WinFormStudy {     static class Program     {          /// <summary>         /// 应用程序的主入口点。         /// </summary>         [STAThread]         static void Main()         {             Process instance = RunningInstance();             if (instance == null)             {                 //没有实例在运行                 Application.Run(new Form1());             }             else             {                 //已经有一个实例在运行                 HandleRunningInstance(instance);             }         }         #region  确保程序只运行一个实例         private static Process RunningInstance()         {             Process current = Process.GetCurrentProcess();             Process[] processes = Process.GetProcessesByName(current.ProcessName);             //遍历与当前进程名称相同的进程列表               foreach (Process process in processes)             {                 //如果实例已经存在则忽略当前进程                   if (process.Id != current.Id)                 {                     //保证要打开的进程同已经存在的进程来自同一文件路径                     if (Assembly.GetExecutingAssembly().Location.Replace("/", "\") == current.MainModule.FileName)                     {                         //返回已经存在的进程                         return process;                                              }                 }             }             return null;         }          private static void HandleRunningInstance(Process instance)         {             MessageBox.Show("已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);             ShowWindowAsync(instance.MainWindowHandle, 1);  //调用api函数,正常显示窗口             SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端         }         [DllImport("User32.dll")]         private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);         [DllImport("User32.dll")]         private static extern bool SetForegroundWindow(System.IntPtr hWnd);         #endregion     } }

或者

using System; using System.Collections.Generic; using System.Windows.Forms;  namespace WinFormStudy {     static class Program     {         /// <summary>         /// 应用程序的主入口点。         /// </summary>         [STAThread]         static void Main()         {             bool ret;             System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out   ret);             if (ret)             {                 System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格                   System.Windows.Forms.Application.DoEvents();                   System.Windows.Forms.Application.Run(new Form1());                 //  frmMain   为你程序的主窗体,如果是控制台程序不用这句                   m.ReleaseMutex();             }             else             {                 MessageBox.Show(null, "有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。\n\n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);                 // 提示信息,可以删除。                   Application.Exit();//退出程序               }         }     } }



0 0
原创粉丝点击