让Windows窗体只运行一次,并在第二次启动窗体时激活该窗体

方法一:
ExpandedBlockStart.gif 导入C++ API
 1 
 2           ///   <summary>  
 3           ///  从这里开始运行 
 4           ///   </summary>  
 5          [STAThread]
 6           static   void  Main()
 7          {
 8              Process instance  =  RunningInstance();
 9               if  (instance  ==   null )
10              {
11                   // 没有实例在运行 
12                  WeatherApp appInstance  =   new  WeatherApp();
13                  appInstance.StartMainGui();
14              }
15               else
16              {
17                   // 已经有一个实例在运行 
18                  HandleRunningInstance(instance);
19              }
20          }
21           #region  确保只有一个实例
22           public   static  Process RunningInstance()
23          {
24              Process current  =  Process.GetCurrentProcess();
25              Process[] processes  =  Process.GetProcessesByName(current.ProcessName);
26               // 遍历与当前进程名称相同的进程列表 
27               foreach  (Process process  in  processes)
28              {
29                   // Ignore the current process 
30                   if  (process.Id  !=  current.Id)
31                  {
32                       // Make sure that the process is running from the exe file. 
33                       if  (Assembly.GetExecutingAssembly().Location.Replace( " / " " \\ " ==  current.MainModule.FileName)
34                      {
35                           // Return the other process instance. 
36                           return  process;
37                      }
38                  }
39              }
40               return   null ;
41          }
42           private   static   void  HandleRunningInstance(Process instance)
43          {
44              MessageBox.Show( " 该应用系统已经在运行! " " 提示信息 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
45              ShowWindowAsync(instance.MainWindowHandle,  1 );  // 调用api函数,正常显示窗口 
46              SetForegroundWindow(instance.MainWindowHandle);  // 将窗口放置最前端。 
47          }
48          [DllImport( " User32.dll " )]
49           private   static   extern   bool  ShowWindowAsync(System.IntPtr hWnd,  int  cmdShow);
50          [DllImport( " User32.dll " )]
51           private   static   extern   bool  SetForegroundWindow(System.IntPtr hWnd);
52           #endregion  
53 

 


方法二:
ExpandedBlockStart.gif Mutex 检测冲突
 1 
 2          [STAThread]
 3           static   void  Main( string [] args)
 4          {
 5               bool  isFirst;
 6 
 7              System.Threading.Mutex mutex  =   new  System.Threading.Mutex( true " WindowAppTest " out  isFirst);
 8               // 这里的myApp是程序的标识,建议换成你的程序的物理路径,这样的话如果在一个操作系统中这个标志不会和其它程序冲突 
 9               if  ( ! isFirst)
10              {
11                  MessageBox.Show( " Exist " );
12                  Environment.Exit( 1 ); // 实例已经存在,退出程序 
13              }
14               else
15              {
16                  Application.Run( new  Form1());
17              }
18          } 
19 

 


方法三
把AssemblyInfo.cs里的[assembly: AssemblyFileVersion("1.0.0.0")]改为[assembly:AssemblyFileVersion("2.0.0.8")],然后利用该信息进行判断。
代码如下:
ExpandedBlockStart.gif 程序集版本号
 1   using  System;
 2  using  System.Collections.Generic;
 3  using  System.Linq;
 4  using  System.Text;
 5  using  System.Diagnostics;
 6  using  System.Reflection;
 7  using  System.Collections;
 8  using  System.Threading;
 9 
10  namespace  MyWork_01
11  {
12       class  Program
13      {
14           static   void  Main( string [] args)
15          {
16              Process[] processes  =  Process.GetProcesses();  // 获得当前所有进程 
17              Process currentProcess  =  Process.GetCurrentProcess();  // 获取当前正在运行进程 
18              ProcessModule currentPM  =  currentProcess.Modules[ 0 ];
19               int  same  =   0 // 相同运行实例个数 
20              ArrayList proList  =   new  ArrayList();  // 将相同实例加入此集合中 
21 
22               foreach  (Process p  in  processes)
23              {
24                   try // 由于进程不同,有的进程不包含Modules信息,所以要用try保护 
25                  {
26                       if  (p.Modules  !=   null )
27                           if  (p.Modules.Count  >   0 )
28                          {
29                              System.Diagnostics.ProcessModule pm  =  p.Modules[ 0 ];
30                               if  (pm.FileVersionInfo.FileVersion.Equals(currentPM.FileVersionInfo.FileVersion))
31                              {
32                                  same ++ ;
33                                  proList.Add(p);
34                              }
35                               if  (same  >   1 )
36                              {
37                                  same ++ ;
38                                  proList.Add(p);
39                                   if  (same  >   1 )
40                                  {
41                                       for  ( int  i  =   0 ; i  <  proList.Count; i ++ )
42                                      {
43                                           if  (((Process)(proList[i])).Id  ==  currentProcess.Id)
44                                          {
45                                              Console.WriteLine( " 该进程已经启动了一个实例 " );
46                                              Thread.Sleep( 1000 );
47                                              ((Process)(proList[i])).Kill();
48                                          }
49                                      }
50                                  }
51                              }
52                          }
53                  }
54                   catch
55                  { }
56              }
57              Console.Read();
58          }
59      }
60  }
61 

 


方法四:直接定义一个属性类,利用此属性信息进行判断。
代码如下:
ExpandedBlockStart.gif 帮助属性
 1   using  System;
 2  using  System.Collections.Generic;
 3  using  System.Linq;
 4  using  System.Text;
 5  using  System.Reflection;
 6  using  System.Diagnostics;
 7  using  System.Collections;
 8  using  System.Threading;
 9 
10  [assembly: Help( " This Assembly demonstrates custom attributes creation and their run-time query. " )]
11 
12  public   class  HelpAttribute : Attribute
13  {
14       public  HelpAttribute(String Description_in)
15      {
16           this .description  =  Description_in;
17      }
18 
19       protected  String description;
20 
21       public  String Description
22      {
23           get
24          {
25               return   this .description;
26          }
27      }
28  }
29  class  Program
30  {
31       static   void  Main( string [] args)
32      {
33          HelpAttribute HelpAttr1  =   null ;
34          HelpAttribute HelpAttr2  =   null ;
35          Process currentProcess  =  Process.GetCurrentProcess();  // 获取当前正在运行进程 
36          Assembly a  =  Assembly.LoadFrom(currentProcess.MainModule.FileName);
37           foreach  (Attribute attr  in  a.GetCustomAttributes( true ))
38          {
39              HelpAttr1  =  attr  as  HelpAttribute;
40               if  ( null   !=  HelpAttr1)
41              {
42                   // Console.WriteLine("Description of {0}:\n{1}", currentProcess.MainModule.FileName, HelpAttr1.Description); 
43                   break ;
44              }
45          }
46          Process[] processes  =  Process.GetProcesses();  // 获得当前所有进程 
47           int  same  =   0 // 相同运行实例个数 
48          ArrayList proList  =   new  ArrayList();  // 将相同实例加入此集合中 
49           foreach  (Process pro  in  processes)
50          {
51               try // 由于进程不同,有的进程不包含Modules信息,所以要用try保护 
52              {
53                   if  (pro.Modules  !=   null )
54                       if  (pro.Modules.Count  >   0 )
55                      {
56                          Assembly b  =  Assembly.LoadFrom(pro.MainModule.FileName);
57                           foreach  (Attribute attr  in  b.GetCustomAttributes( true ))
58                          {
59                              HelpAttr2  =  attr  as  HelpAttribute;
60                               if  ( null   !=  HelpAttr2)
61                              {
62                                   if  (HelpAttr1.Description.Equals(HelpAttr2.Description))
63                                  {
64                                      same ++ ;
65                                      proList.Add(pro);
66                                       if  (same  >   1 )
67                                      {
68                                           for  ( int  i  =   0 ; i  <  proList.Count; i ++ )
69                                          {
70                                               if  (((Process)(proList[i])).Id  ==  currentProcess.Id)
71                                              {
72                                                  Console.WriteLine( " 该进程已经启动了一个实例 " );
73 
74                                                  Thread.Sleep( 1000 );
75                                                  ((Process)(proList[i])).Kill();
76 
77                                              }
78                                          }
79                                      }
80                                  }
81                              }
82                          }
83                      }
84              }
85               catch
86              {
87              }
88          }
89          Console.ReadLine();
90      }
91 
92  }

 

转载于:https://www.cnblogs.com/huang_8228/archive/2010/12/14/1905552.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值