下面代码用来限制软件只运行一个实例:[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int CreateMutex(int lpMutexAttributes, int bInitialOwner, string lpName);[DllImport("kernel32")]
public static extern int GetLastError();
/// <summary>
/// 检查是否已经运行了一个实例
/// </summary>
/// <param name="ID"></param>
/// <returns></returns>
public static bool Check(string ID)
{
int s=0;
s=GetLastError();//为什么一定要这一句
int ret=CreateMutex(0,1,ID);
if(ret!=0)
{
s=GetLastError();
if(s==(int)Socg.API.Constants.ERROR_ALREADY_EXISTS)
{
return true;
}
else
{
return false;
}
}
else
{
throw new Socg.ExceptionLog();
}
}
....static void Main() 
{
if(Check("adsfadsf")==true)
{
MessageBox.Show("程序已运行");
return;
}....}
当运行第二个实例时会拒绝运行。
大家注意Check()中第二句,为什么我删除第二句后就不起中用了呢??

解决方案 »

  1.   

    .NET API里就有 Mutex 这个类,不知道楼主非要用PInvoke(Win32 API)来做么?private static System.Threading.Mutex mobjMutex;mobjMutex = new System.Threading.Mutex(true, TITLE, out blnCreateNew);
    if (!blnCreateNew)
    {
       //重复启动! 
    }
      

  2.   

    原理是这样的:拿一个固定字符串作为进程标识。你代码里的标识就是“adsfadsf”。我给你的代码里的表示是定义为TITLE的String常量。
      

  3.   

    当然可以用一楼的方法做,但是我说的问题不怎样完成这个功能,而是为什么去掉Check()中的第二句后结果就不一样了,我的好奇心很重!!!