【第22期】观点:IT 行业加班,到底有没有价值?

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

转载 2007年09月16日 16:58:00

涉及类:
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是多进程操作系统,框架生成的应用程序可以多次运行,形成多个运行实例。但在有些情况下为保证应用程序的安全运行,要求程序只能运行一个实例,比如程序要使用只能被一个进程单独使用的特殊硬件(例如...
  • sdcxyz
  • sdcxyz
  • 2011-09-23 17:02
  • 6978

用VC制作应用程序启动画面

用VC制作应用程序启动画面 作者:yangjin阅读人次:787文章来源:不详发布时间:2
  • isiqi
  • isiqi
  • 2011-06-13 10:36
  • 559

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Windows Phone开发

摘自 http://my.csdn.net/cc_net 的博客,写的不错,内容比较多,直接全引过来了。   Windows Phone开发(一)-- 开发环境和结构              ...

【项目经验】iphone 应用程序图标、启动画面、itune图标等总结

先说说应用程序图标,一般有下面几种: <span style="font-family: 'Lucida Grande',Geneva,Arial,Verdana,sans-serif; c

C#在终端服务器只允许运行应用程序的一个实例

只允许运行应用程序的一个实例,用Mutex互斥体可以实现,但是一定要明确程序运行场景。 常见代码如下: static void Main()         {            ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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