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 }

 

转载于:https://www.cnblogs.com/haibing0107/p/8086126.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值