因为一个项目的需求,要实现程序只有一个实例运行。在网上搜了很久,最后在CSDN上面看到一回复。得到启示,完成该功能。
主要用的是互斥对象来实现。代码如下:
- staticclassProgram
- {
- [DllImport("coredll.Dll",SetLastError=true)]
- privatestaticexternIntPtrCreateMutex(SECURITY_ATTRIBUTESlpMutexAttributes,boolbInitialOwner,stringlpName);
- [DllImport("coredll.Dll",SetLastError=true)]
- privatestaticexternintReleaseMutex(IntPtrhMutex);
- [StructLayout(LayoutKind.Sequential)]
- publicclassSECURITY_ATTRIBUTES
- {
- publicintnLength;
- publicintlpSecurityDescriptor;
- publicintbInheritHandle;
- }
- constintERROR_ALREADY_EXISTS=0183;
- ///<summary>
- ///应用程序的主入口点。
- ///</summary>
- [MTAThread]
- staticvoidMain()
- {
- IntPtrhMutex=CreateMutex(null,false,"StandardWorkMan");
- if(Marshal.GetLastWin32Error()!=ERROR_ALREADY_EXISTS)
- {
- Application.Run(newFormWorkList());
- }
- else
- {
- MessageBox.Show("已经启动了一个程序,请勿重复打开","系统提示",
- MessageBoxButtons.OKCancel,MessageBoxIcon.Asterisk,MessageBoxDefaultButton.Button1);
- ReleaseMutex(hMutex);
- Application.Exit();
- }
- }
- }
上面代码完全正常,我的问题是大部分自己很早就写出来了。只是问题在下面:
- [DllImport("coredll.Dll",SetLastError=true)]
- privatestaticexternintGetLastError();
- .
- if(GetLastError()!=ERROR_ALREADY_EXISTS)
- {
- Application.Run(newFormWorkList());
- }
我用的是平台调用里面的GetLastError(),结果一直出不来想要的效果。调试时发现无论打开多少个实例,GetLastError()的值一直都是6(INVALID_HANDLE_VALUE)????很不解。望明白的人说明一下。谢谢。
【编辑推荐】