Code
通过创建互斥量来实现但启动,下面贴部分代码:
IntPtr hMutex = IntPtr.Zero;
hMutex = CreateMutex(null, true, "SUPERMAIL-WM");
int err = Marshal.GetLastWin32Error();
if(err!=0)
{
// 如果已经有程序运行,则立刻退出
if (err == ERROR_ALREADY_EXISTS)
{
return;
}
// 如果没有,则重试三次
for(int i=0;i<3;i++)
{
hMutex = CreateMutex(null, true, "SUPERMAIL-WM");
err = Marshal.GetLastWin32Error();
if (err == ERROR_ALREADY_EXISTS)
{
return;
}
System.Threading.Thread.Sleep(1000);
}
}
下面是用到的win32 函数,通过P/Invoke调用
[DllImport("coredll.Dll", SetLastError = true)]
private static extern int ReleaseMutex(IntPtr hMutex);
[DllImport("coredll.Dll", SetLastError = true)]
private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes, bool bInitialOwner, string lpName);
[StructLayout(LayoutKind.Sequential)]
public class SECURITY_ATTRIBUTES
{
public int nLength;
public int lpSecurityDescriptor;
public int bInheritHandle;
}
const int ERROR_ALREADY_EXISTS = 0183;
记得在程序退出的时候要调用ReleaseMutex 来销毁互斥量。
通过创建互斥量来实现但启动,下面贴部分代码:
IntPtr hMutex = IntPtr.Zero;
hMutex = CreateMutex(null, true, "SUPERMAIL-WM");
int err = Marshal.GetLastWin32Error();
if(err!=0)
{
// 如果已经有程序运行,则立刻退出
if (err == ERROR_ALREADY_EXISTS)
{
return;
}
// 如果没有,则重试三次
for(int i=0;i<3;i++)
{
hMutex = CreateMutex(null, true, "SUPERMAIL-WM");
err = Marshal.GetLastWin32Error();
if (err == ERROR_ALREADY_EXISTS)
{
return;
}
System.Threading.Thread.Sleep(1000);
}
}
下面是用到的win32 函数,通过P/Invoke调用
[DllImport("coredll.Dll", SetLastError = true)]
private static extern int ReleaseMutex(IntPtr hMutex);
[DllImport("coredll.Dll", SetLastError = true)]
private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes, bool bInitialOwner, string lpName);
[StructLayout(LayoutKind.Sequential)]
public class SECURITY_ATTRIBUTES
{
public int nLength;
public int lpSecurityDescriptor;
public int bInheritHandle;
}
const int ERROR_ALREADY_EXISTS = 0183;
记得在程序退出的时候要调用ReleaseMutex 来销毁互斥量。