中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > .NET > 临时文章
用C#给程序加启动画面并只允许一个应用程序实例运行
作者:未知 时间:2004-11-15 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无

涉及类:

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

 

             

 

         }

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有