因為一個項目的需求,要實現程式只有一個執行個體運行。在網上搜了很久,最後在CSDN上面看到一回複。得到啟示,完成該功能。
主要用的是互斥對象來實現。代碼如下:
static class Program
{
[DllImport("coredll.Dll",SetLastError= true)]
private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes, bool bInitialOwner, string lpName);
[DllImport("coredll.Dll",SetLastError = true)]
private static extern int ReleaseMutex(IntPtr hMutex);
[StructLayout(LayoutKind.Sequential)]
public class SECURITY_ATTRIBUTES
{
public int nLength;
public int lpSecurityDescriptor;
public int bInheritHandle;
}
const int ERROR_ALREADY_EXISTS = 0183;
/// <summary>
/// 應用程式的主進入點。
/// </summary>
[MTAThread]
static void Main()
{
IntPtr hMutex = CreateMutex(null, false, "StandardWorkMan");
if (Marshal.GetLastWin32Error() != ERROR_ALREADY_EXISTS)
{
Application.Run(new FormWorkList());
}
else
{
MessageBox.Show("已經啟動了一個程式,請勿重複開啟", "系統提示",
MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
ReleaseMutex(hMutex);
Application.Exit();
}
}
}
上面代碼完全正常,我的問題是大部分自己很早就寫出來了。只是問題在下面:
[DllImport("coredll.Dll",SetLastError = true)]
private static extern int GetLastError();
.
if (GetLastError() != ERROR_ALREADY_EXISTS)
{
Application.Run(new FormWorkList());
}
我用的是平台叫用裡面的GetLastError(),結果一直出不來想要的效果。調試時發現無論開啟多少個執行個體,GetLastError()的值一直都是6(INVALID_HANDLE_VALUE)????很不解。 望明白的人說明一下。謝謝。