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

///

1<summary>
2
3///  必需的设计器变量。 
4
5///  </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

{

///

1<summary>
2
3///  AppLoader  的摘要说明。 
4
5///  </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();

<SPAN lang=EN-US styl

Published At
Categories with Web编程
Tagged with
comments powered by Disqus