第一种方法 代码如下
【1.】
[csharp]
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
- //using RFIDWareHouse.View;
- using System.Runtime.InteropServices;
- namespace Phone
- {
- static class Program
- {
- [DllImport("coredll.Dll")]
- private static extern int GetLastError();
- [DllImport("coredll.Dll")]
- private static extern int ReleaseMutex(IntPtr hMutex);
- [DllImport("coredll.Dll")]
- private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes, bool bInitialOwner, string lpName);
- private const int ERROR_ALREADY_EXISTS = 0183;
- [StructLayout(LayoutKind.Sequential)]
- public class SECURITY_ATTRIBUTES { public int nLength; public int lpSecurityDescriptor; public int bInheritHandle; }
- /// <summary>
- /// 应用程序的主入口点。
- /// </summary>
- [MTAThread]
- static void Main()
- {
- // Application.Run(new frMain());
- IntPtr hMutex = CreateMutex(null, false, "Futureproduct");
- if (GetLastError() != ERROR_ALREADY_EXISTS)
- {
- System.Windows.Forms.Application.Run(new frMain());
- return;
- }
- else
- {
- MessageBox.Show("程序已经启动.");
- ReleaseMutex(hMutex);
- return;
- }
- }
- }
- }
【2】 第二种方法:
[csharp]
- public class Mutex
- {
- [DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
- public static extern IntPtr CreateMutex(
- IntPtr lpMutexAttributes,
- bool InitialOwner,
- string MutexName);
- [DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]
- public static extern bool ReleaseMutex(IntPtr hMutex);
- private const int ERROR_ALREADY_EXISTS = 0183;
- /// <summary>
- /// 判断程序是否已经运行
- /// </summary>
- /// <returns>
- /// true: 程序已运行,则什么都不做
- /// false: 程序未运行,则启动程序
- /// </returns>
- public static bool IsExist()
- {
- string strAppName =
- System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
- IntPtr hMutex = CreateMutex(IntPtr.Zero, true, strAppName);
- if (hMutex == IntPtr.Zero)
- throw new ApplicationException("Failure creating mutex: "
- + Marshal.GetLastWin32Error().ToString("X"));
- if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS)
- {
- ReleaseMutex(hMutex);
- return true;
- }
- return false;
- }
- }
【3.】
有时在开发程序的时候, 有时需要只能同时运行一个实例.
Mutex 类, 称为互拆体, 是一个同步基元, 它只向一个线程授予对共享资源的独占访问权。 当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。 如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。 下面演示 Mutex 类来保证应用程序只有唯一实例
[csharp]
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Windows.Forms;
- namespace 让程序只启动一次
- {
- static class Program
- {
- /// <summary>
- /// 应用程序的主入口点。
- /// </summary>
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- bool bCreate;
- System.Threading.Mutex mutex = new System.Threading.Mutex(false, "SINGILE_INSTANCE_MUTEX", out bCreate);
- if (bCreate)
- {
- Application.Run(new Form1());
- }
- else
- {
- MessageBox.Show("程序已经启动");
- Application.Exit();
- }
- }
- }
- }
我之前 也很苦恼 有的程序可以 只能开启程序一次
但是 有的程序为什么不行啊 代码都一样,你有没有发现 这是什么问题??
如果 上面的方法 都不起作用 尝试下面的这个方法
【4。】
[csharp]
- using System;
- using System.Linq;
- using System.Collections.Generic;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- namespace PDAapplication
- {
- static class Program
- {
- /// <summary>
- /// 应用程序的主入口点。
- /// </summary>
- [MTAThread]
- static void Main()
- {
- //Application.Run(new forApplicatinesMan());
- IntPtr hDlg=IntPtr.Zero;
- hDlg = FindWindow(null, "ThisWindows");//ThisWindows:应用程序主窗体
- if (hDlg != IntPtr.Zero)
- {
- SetForegroundWindow(hDlg);
- }
- else
- {
- Application.Run(new forApplicatinesMan());
- }
- }
- [DllImport("coredll.Dll")]
- public static extern IntPtr FindWindow(String classname, String title);
- [DllImport("coredll.Dll")]
- public static extern void SetForegroundWindow(IntPtr hwnd);
- }
- }