C#代码实现,确保windows程序只有一个实例(instance)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Runtime.InteropServices;
 4 using System.Windows.Forms;
 5 
 6 namespace Test
 7 {
 8     static class Program
 9     {
10         /// <summary>
11         /// 应用程序的主入口点。
12         /// </summary>
13         [STAThread]
14         static void Main()
15         {
16 
17             //防止程序多次运行
18             if (!OneInStance.IsFirst("GetPayInfo"))
19             {
20                 MessageBox.Show("警告:程序正在运行中! 请不要重复打开程序!", "程序错误提示:", MessageBoxButtons.OK, MessageBoxIcon.Stop);
21                 return;
22             }
23 
24             Application.EnableVisualStyles();
25             Application.SetCompatibleTextRenderingDefault(false);
26             Application.Run(new Form1());
27         }
28     }
29 
30     //---------防止程序多次运行----------//
31     public abstract class OneInStance
32     {
33         /// <summary>
34         /// 判断程序是否正在运行
35         /// </summary>
36         /// <param name="appld">程序名称</param>
37         /// <returns>如果程序第一次运行返回TRUE否则返回False</returns>
38         public static bool IsFirst(string appId)
39         {
40             bool ret = false;
41 
42             if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
43             {
44                 CreateMutex(IntPtr.Zero, 0, appId);
45                 ret = true;
46             }
47 
48             return ret;
49         }
50 
51         /// <summary>
52         /// 为现有的一个已命名互斥体对象创建一个新句柄
53         /// </summary>
54         /// <param name="dwDesiredAccess"></param>
55         /// <param name="bInheritHandle">如希望子进程能够继承句柄,则为TRUE</param>
56         /// <param name="lpName">要打开对象的名字</param>
57         /// <returns></returns>
58         [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
59         private static extern IntPtr OpenMutex(
60             uint dwDesiredAccess, // access
61             int bInheritHandle, // inheritance option
62             string lpName // object name
63         );
64 
65         /// <summary>
66         /// 找出当前系统是否已经存在指定进程的实例。
67         /// 如果没有则创建一个互斥体。
68         /// CreateMutex()函数可用来创建一个有名或无名的互斥量对象:
69         /// </summary>
70         /// <param name="lpMutexAttributes">指向安全属性的指针</param>
71         /// <param name="bInitialOwner">初始化互斥对象的所有者</param>
72         /// <param name="lpName">指向互斥对象名的指针</param>
73         /// <returns></returns>
74         [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
75         private static extern IntPtr CreateMutex(
76         IntPtr lpMutexAttributes, // SD
77         int bInitialOwner, // initial owner
78         string lpName // object name
79         );
80     }
81 }

 

posted @ 2017-12-22 15:14  涂山吕吕  阅读(3423)  评论(0编辑  收藏  举报