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

}

时间: 2024-08-07 15:28:40

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

如何给基于对话框的应用加启动画面

很多基于对话框的程序都有一个启动画面,那么如何为自己的对话框程序也加一个这样的画面呢?本文将一步一步教你实现每一个细节.其实VC++开发环境中有一个现成的 Splash Screen 组件,用这个组件很容易实现基于框架类(也就是CMainFrame)的程序的启动画面,那么如果是对话框程序,没有框架类怎么办呢?所以这个组件功能不是想象的那么强.要实现基于对话框应用程序的启动画面必须另辟蹊径.本文将定制一个C++类:CSplashWnd,用这个类可以增强原来的 Splash Screen 组件功能.

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

摘 要:本文提供了四种启动画面制作方法.  使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是 可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢?本文提供四种方法.前三种适用于基于文档的应用程序,第四种适用于基于对话框的应用程 序.  1.利用组件库中的Splash Screen组件实现 (1)用Photoshop等制作启动画面图像,保存为bmp格式. (2)用Appwizard建一个基于单文档的工程Splash. (3)在资源中插入位图

视觉设计:小小启动画面蕴藏着很多讲究

文章描述:小小的启动画面到底有什么学问,它对产品用户体验都有哪些影响?本篇文章做了一些分析和总结,希望对你有帮助. 需要点击图标,等待应用程序启动.在这个简单的过程中,启动画面会呈现在我们眼前.有时候它让我们眼前一亮,有时候它会让我们感到困惑,有时候它会让我们感到厌倦--小小的启动画面到底有什么学问,它对产品用户体验都有哪些影响?本篇文章做了一些分析和总结,希望对你有帮助. 什么是启动画面当用户启动一个操作系统.软件或者应用程序的时候,首先出现的承载产品标识及相关信息的图形界面.例如,Offic

VC四种程序启动画面的制作方法

摘要:本文提供了四种启动画面制作方法. 使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢?本文提供四种方法,前三种适用于基于文档的应用程序,第四种适用于基于对话框的应用程序. 1.利用组件库中的Splash Screen组件实现 (1)用Photoshop等制作启动画面图像,保存为bmp格式. (2)用Appwizard建一个基于单文档的工程Splash. (3)在资源中插入位图资源 打开

手机应用程序启动画面

本文首发于MDchina,汇聚了一群热爱移动互联网的产品经理和设计师,也是一个专业的http://www.aliyun.com/zixun/aggregation/38917.html">分享平台. iPhone官方设计指南对于启动图片(launch images)描述中期望是开发人员能够尽量简化应用程序的启动过程,使用应用程序主页的背景图片作为启动图片,让程序能够快速启动,不过遵守这条建议的应用程序非常少. 在PC上,由于大型游戏和软件加载的时间比较长,启动画面应用比较多,主要有两方面内

windows-Windows程序不使用MFC如何添加启动画面?

问题描述 Windows程序不使用MFC如何添加启动画面? 如题,万谢!!! 30 解决方案 http://www.codeproject.com/Articles/7658/CSplash-A-Splash-Window-Class 不用mfc,只用win32 api 解决方案二: 给程序添加启动画面----------------------

ios编程:iphone的启动画面

一种方法是,直接在应用程序根目录下放置一个default.png图片作为程序的启动画面. 下面是另一种方法,转自: http://blogold.chinaunix.net/u1/49717/showart_2180128.html 今天,我将介绍怎样为你的程序加一些"铃和哨"(注:指一些附加的花哨的东西)是你 的游戏显得更完整.首先,我们为游戏增加一个启动页面. 创建启动页面 我们加入的启动页面将淡出到游戏主屏幕.你可以下载此图像加入到项 目的Resources(资源)文件夹中. 请

不简单的启动画面

分享到: 新浪 花瓣网 添加到收藏夹 需要点击图标,等待应用程序启动.在这个简单的过程中,启动画面会呈现在我们眼前.有时候它让我们眼前一亮,有时候它会让我们感到困惑,有时候它会让我们感到厌倦-- 小小的启动画面到底有什么学问,它对产品用户体验都有哪些影响?本篇文章做了一些分析和总结,希望对你有帮助. 什么是启动画面 当用户启动一个操作系统.软件或者应用程序的时候,首先出现的承载产品标识及相关信息的图形界面.例如,Office软件程序的启动画面,上面有产品的标识,发行公司以及一些可能的操作. 为什

Applet 启动画面 狂闪

问题描述 请问我自定义了Applet的启动画面,设置了一个gif图片,但是发现图片超级快,请问如何控制帧速?<appletid="wwjApplet"code="org.jdesktop.applet.util.JNLPAppletLauncher"width=100%height=100%archive="lib/applet-launcher.jar"><paramname="separate_jvm"v