zoukankan      html  css  js  c++  java
  • 用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

  • 相关阅读:
    盒子垂直水平居中
    Sahi (2) —— https/SSL配置(102 Tutorial)
    Sahi (1) —— 快速入门(101 Tutorial)
    组织分析(1)——介绍
    Java Servlet (1) —— Filter过滤请求与响应
    CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
    JBoss Wildfly (1) —— 7.2.0.Final编译
    CAS (7) —— Mac下配置CAS 4.x的JPATicketRegistry(服务端)
    CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解
    CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/4740942.html
Copyright © 2011-2022 走看看