会员
周边
众包
新闻
博问
闪存
赞助商
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
Aipeli
最美的青春留在了“博客园”
博客园
首页
联系
管理
用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
)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面
返回顶部
公告