用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."); 







}
 
posted @ 2005-05-30 20:51  泡面 @ 幸福  阅读(779)  评论(0编辑  收藏  举报