涉及类:
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