我做的是winform程序,,我想实现单实例启动,就是只能启动一个窗体,现在我的做法是:
bool b= true;
Mutex mutex = new Mutex(true, “name”, out b);
if (!b)
{
    this.Shutdown();
    return;
}可是这样做的话,仍然能够时常启动,好像是Mutex的一个回收机制的原因,可是怎么能实现只启动一个窗口呢?谢谢!

解决方案 »

  1.   


     /// <summary>
            /// 
            /// </summary>
            /// <param name="lpClassName"></param>
            /// <param name="lpWindowName"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "FindWindow")]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            /// <summary>
            /// 
            /// </summary>
            /// <param name="hwnd"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
            public static extern IntPtr SetForegroundWindow(IntPtr hwnd);/// <summary>
            /// 互斥实例
            /// </summary>
            private Mutex m_mt           = null;/// <summary>
            /// 单实例设置(放在构造函数中即可)
            /// </summary>
            private void MutexRun()
            {
                bool bRun;
                m_mt = new Mutex(true, "TestRun", out bRun);
                if (!bRun)
                {
                    IntPtr Hander = CommonGenerator.FindWindow(null, "窗体标题");
                    if (Hander != IntPtr.Zero)
                    {
                        CommonGenerator.SetForegroundWindow(Hander);
                    }
                    m_mt.Close();
                    Environment.Exit(1);
                    return;
                }
            }
      

  2.   


    Boolean createdNew = true;
                System.Threading.Mutex m = new System.Threading.Mutex(true, Assembly.GetEntryAssembly().FullName, out createdNew);
                if (createdNew)
                {
                    RunApplication();
                    m.ReleaseMutex();
                }