在winform开发中,经常需要限制一个程序只能打开一个进程,以达到项目中的一些特殊要求,所使用的方法也有很多,我这里使用的是Mutex这个进程锁;当程序已经打开的时候,有的时候有需要把焦点设置到已经打开的那个程序的窗体上,这个时候可以时候FindWindow和SetForegroundWindow这两个win32方法,下面来看下代码。
View Code
1
using
System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Windows.Forms;
5 using System.Runtime.InteropServices;
6 using System.Threading;
7
8 namespace Test
9 {
10 static class Program
11 {
12
13 [DllImport( " user32.dll " )]
14 public static extern IntPtr FindWindow(String classname, String title);
15 [DllImport( " user32.dll " )]
16 public static extern void SetForegroundWindow(IntPtr hwnd);
17
18 /// <summary>
19 /// 应用程序的主入口点。
20 /// </summary>
21 [STAThread]
22 static void Main()
23 {
24 Application.EnableVisualStyles();
25 Application.SetCompatibleTextRenderingDefault( false );
26
27 bool mutexWasCreated;
28 //
29 Mutex mutex = new Mutex( true , " Mutex " , out mutexWasCreated);
30 if ( ! mutexWasCreated)
31 {
32 // 每个窗体的title,当运用程序已经打开的时候,用来获取当前最上面的那个窗体
33 // 然后激活这个窗体,并设置焦点
34 string [] frmTexts = {
35 " 窗体1的Title " ,
36 " 窗体2的Title " ,
37 };
38 try
39 {
40 foreach ( string str in frmTexts)
41 {
42 IntPtr ptr = FindWindow( null , str);
43 // 不等于0表示找到了窗体
44 if (ptr.ToString() != " 0 " )
45 {
46 SetForegroundWindow(ptr);
47 break ;
48 }
49 }
50 }
51 catch
52 {
53 }
54 return ;
55 }
56 Application.Run( new Form1());
57 // 最后要释放,如果程序中调用了Environment.Exit(0)来推出程序的话,那么最后把mutex设置为全局的
58 // 在调用Environment.Exit(0)之前就释放一次,否则要等系统自动释放才可以再次打开程序
59 mutex.ReleaseMutex();
60 }
61 }
62 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Windows.Forms;
5 using System.Runtime.InteropServices;
6 using System.Threading;
7
8 namespace Test
9 {
10 static class Program
11 {
12
13 [DllImport( " user32.dll " )]
14 public static extern IntPtr FindWindow(String classname, String title);
15 [DllImport( " user32.dll " )]
16 public static extern void SetForegroundWindow(IntPtr hwnd);
17
18 /// <summary>
19 /// 应用程序的主入口点。
20 /// </summary>
21 [STAThread]
22 static void Main()
23 {
24 Application.EnableVisualStyles();
25 Application.SetCompatibleTextRenderingDefault( false );
26
27 bool mutexWasCreated;
28 //
29 Mutex mutex = new Mutex( true , " Mutex " , out mutexWasCreated);
30 if ( ! mutexWasCreated)
31 {
32 // 每个窗体的title,当运用程序已经打开的时候,用来获取当前最上面的那个窗体
33 // 然后激活这个窗体,并设置焦点
34 string [] frmTexts = {
35 " 窗体1的Title " ,
36 " 窗体2的Title " ,
37 };
38 try
39 {
40 foreach ( string str in frmTexts)
41 {
42 IntPtr ptr = FindWindow( null , str);
43 // 不等于0表示找到了窗体
44 if (ptr.ToString() != " 0 " )
45 {
46 SetForegroundWindow(ptr);
47 break ;
48 }
49 }
50 }
51 catch
52 {
53 }
54 return ;
55 }
56 Application.Run( new Form1());
57 // 最后要释放,如果程序中调用了Environment.Exit(0)来推出程序的话,那么最后把mutex设置为全局的
58 // 在调用Environment.Exit(0)之前就释放一次,否则要等系统自动释放才可以再次打开程序
59 mutex.ReleaseMutex();
60 }
61 }
62 }