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 }