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

转载 2006年05月31日 09:29:00
 用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.");
 
             
 
         }

相关文章推荐

MFC中应用程序只允许运行一个实例方法一

Windows是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬件(例如...

MFC中应用程序只允许运行一个实例

Windows是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬件(例如...

MFC中应用程序只允许运行一个实例

Windows是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬件(例如...
  • zhubosa
  • zhubosa
  • 2013年09月01日 18:39
  • 1284

MFC中应用程序只允许运行一个实例

Windows是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬件(例如...
  • sdcxyz
  • sdcxyz
  • 2011年09月23日 17:02
  • 7152

MFC中应用程序只允许运行一个实例

Windows是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬件(例如...

MFC中应用程序只允许运行一个实例

Windows是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬件(例如...

MFC:只允许产生一个应用程序实例的具体实现

Windows是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序 只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬...

C#程序只允许运行一个实例的解决方案

最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端。在网上google了一哈,找到了很多的解决方案。这里我整理了3种方案,并经过了测试,现和朋友们分...
  • ybhjx
  • ybhjx
  • 2016年12月17日 13:58
  • 262

使用C#实现只允许运行一个程序实例的几种方法

本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运行。要实现程序的互斥,通常有下面几种方式,下面用 C# 语言来实现:方法一:     使用线程互斥变量. 通过定义互斥变量来判断是否已运...

解决C#程序只允许运行一个实例的几种方法详解

方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例. 把program.cs文件里的Main()函数改为如下代码:using System; using System.Windows.F...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C#给程序加启动画面并只允许一个应用程序实例运行
举报原因:
原因补充:

(最多只允许输入30个字)