如何在 .net 中只运行一个进程实例?

class SingleProcessTest
{
        private const int WS_SHOWNORMAL = 1;
        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

void Main()
{
               Process instance = GetRunningInstance();
                if (instance == null)
                {
                    Application.Run(new myForm());
                }
                else
                {
                    HandleRunningInstance(instance);
                }
}

        ///   <summary>  
        ///   获取应用程序的实例,没有其它的例程,返回Null  
        ///   </summary>  
        ///   <returns></returns>  
        public static Process GetRunningInstance()
        {
            Process current = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(current.ProcessName);
            //遍历正在有相同名字运行的例程  
            foreach (Process process in processes)
            {
                //忽略现有的例程  
                if (process.Id != current.Id && process.SessionId == current.SessionId)
                    //确保例程从EXE文件运行  
                    if (Assembly.GetExecutingAssembly().Location.Replace("/", """") == current.MainModule.FileName)
                        //返回另一个例程实例  
                        return process;
            }
            return null;
        }

        ///   <summary>  
        ///   获取窗口句柄  
        ///   </summary>  
        ///   <param name="instance"></param>  
        public static void HandleRunningInstance(Process instance)
        {
            //确保窗口没有被最小化或最大化  
            ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
            //设置真实例程为foreground window  
            SetForegroundWindow(instance.MainWindowHandle);
        }

}

posted on 2008-01-17 18:04  gogogo  阅读(273)  评论(0编辑  收藏  举报

导航