• 用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

  • 相关阅读:
    Jersey初始化配置
    Jersey框架简介
    警告: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:esignmanage' did not find a matching property.解决
    HIbernate基于外键的查询
    Apache Maven 入门篇(下)
    Apache Maven 入门篇 ( 上 )
    DetachedCriteria用法
    SQL Excel导入到sqlserver表
    轮番图片js
    Js Tab页(二)
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/4740942.html
Copyright © 2020-2023  润新知