用C#给程序加启动画面并只允许一个应用程序实例运行

1、   启动画面类:
    public class SplashForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.PictureBox pictureBox1;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label lbl_version;
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.Container components = null;

        public SplashForm()
        {
            //
            // Windows 窗体设计器支持所必需的
            //
            InitializeComponent();
            lbl_version.Text = "版本:" + Application.ProductVersion;


            //
            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            //
        }
        //以下省略
2、  应用程序加载类:
using System; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Data; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Reflection; 
using System.IO;


namespace Heroic.TempAnalyse.TempGui 
{ 
    /// <summary> 
    /// AppLoader 的摘要说明。 
    /// </summary> 
    public class AppLoader 
    { 
        private static ApplicationContext context; 
        private static SplashForm sForm = new SplashForm(); 
        private static MainWindow mForm = null; 
        //0不可见但仍然运行,1居中,2最小化,3最大化 
        private const int WS_SHOWNORMAL = 3; 


        [STAThread]   
        static void Main(string[] args)   
        {      
            //  [8/12/2004]用于更新该程序。
            doUpData();
            //  [7/19/2004] 改变顺序,目的使得开始加载速度加快 
            //得到正在运行的例程 
            Process instance = RunningInstance(); 
            if(instance == null) 
            { 
                sForm.Show(); 
                mForm = new MainWindow(); 
                context = new ApplicationContext();      
                Application.Idle += new EventHandler(OnAppIdle); 
                Application.Run(context); 
            } 
            else 
            { 
                //处理发现的例程 
                HandleRunningInstance(instance); 
                //MessageBox.Show("当前程序已经运行了!"); 
            } 
        } 
        //在线更新用,不再本文范围
        private static void doUpData()
        {    
            System.Diagnostics.Process.Start(Application.StartupPath+@"\update.exe",Application.StartupPath+@"\Heroic.TempAnalyse.TempGui.exe 0");//        
        }

        private static void OnAppIdle(object sender, EventArgs e)   
        { 
            if(context.MainForm == null)      
            { 
                Application.Idle -= new EventHandler(OnAppIdle);                
                mForm.PreLoad(); 
                context.MainForm = mForm; 
                context.MainForm.Show();         
                sForm.Close();         
                sForm = null;      
            }   
        } 
        //不允许有两个程序同时启动
        public static Process RunningInstance() 
        { 
            Process current = Process.GetCurrentProcess(); 
            Process[] processes = Process.GetProcessesByName (current.ProcessName); 
            //遍历正在有相同名字运行的例程 
            foreach (Process process in processes) 
            { 
                //忽略现有的例程 
                if (process.Id != current.Id) 
                { 
                    //确保例程从EXE文件运行 
                    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == 
                        current.MainModule.FileName) 
                    { 
                        //返回另一个例程实例 
                        return process; 
                    } 
                } 
            } 
            //没有其它的例程,返回Null 
            return null; 
        } 

        public static void HandleRunningInstance(Process instance) 
        { 
            //确保窗口没有被最小化或最大化 
            ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL); 

            //设置真实例程为foreground window 
            SetForegroundWindow (instance.MainWindowHandle); 
        } 

        [DllImport("User32.dll")] 

        private static extern bool ShowWindowAsync( 
            IntPtr hWnd, int cmdShow); 
        [DllImport("User32.dll")] private static extern bool 
            SetForegroundWindow(IntPtr hWnd); 
    } 
}
3、  加载完毕正式运行后的类:
        public void PreLoad()
        {
            //    如果已经加载毕,则返回
            if (_Loaded)
                return;


            //    把机器生成的代码放到这里
            initCustomControl();

                    

            _Loaded = true;

        }

        //    是否加载完毕
        private bool _Loaded = false;

        protected override void OnLoad(EventArgs e)
        {
            //    确保 PreLoad()函数已经调用
            if (!_Loaded)
                throw new InvalidOperationException("Must call PreLoad before calling this function.");

            

        }

 

C#只能运行一个winForm进程
[STAThread]
   static void Main() 
   {
            Process instance = RunningInstance();
            if (instance == null)
            {
                System.Windows.Forms.Application.EnableVisualStyles();    //这两行可以让窗体具有XP风格.
                System.Windows.Forms.Application.DoEvents();
                Application.Run(new ClientForm());
            }
            else
            {
                HandleRunningInstance(instance);                
            }
   }
#region   只运行一个实例 
public static Process RunningInstance() 
{ 
Process current = Process.GetCurrentProcess(); 
Process[] processes = Process.GetProcessesByName (current.ProcessName); 
//遍历与当前进程名称相同的进程列表 
foreach (Process process in processes) 
{ 
//Ignore the current process 
if (process.Id != current.Id) 
{ 
//Make sure that the process is running from the exe file. 
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) 
{ 
//Return the other process instance. 
return process; 
} 
} 
} 
return null; 
} 
private static void HandleRunningInstance(Process instance) 
{ 
MessageBox.Show("该应用系统已经在运行!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information); 
ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL); //调用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); 
private const int WS_SHOWNORMAL = 1;  
#endregion 

 引文分享:http://yun.baidu.com/share/link?shareid=2304419568&uk=3221713554

posted @ 2015-08-18 23:06  rainbow70626  阅读(404)  评论(0编辑  收藏  举报