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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM