正文

用C#给程序加启动画面并只允许一个应用程序实例运行2006-05-31 16:20:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/Csharpsky/15249.html

分享到:

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

阅读(1741) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册