Wince C#只運行一個實例有解決辦法

C#寫winForm程序和WinCE程序,實現單實例運行的代碼是不一樣的。收集多人的代碼,測試成功,放在這裏大家借鑑。

一、WinForm簡單。

    static class Program
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool runone;
            System.Threading.Mutex run = new System.Threading.Mutex(true, Application.ProductName, out runone);//核心代碼
            if (runone == true)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainImpExp());
            }
            else
            {
                MessageBox.Show("已經運行了一個實例了。");
                Application.Exit();
            }
        }
    }

二、Wince複雜。

#region OpenNETCF native interface to mutex generation (version 1.4 of the SDF)


        public const Int32 NATIVE_ERROR_ALREADY_EXISTS = 183;


        #region P/Invoke Commands for Mutexes


        [DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
        public static extern IntPtr CreateMutex(
            IntPtr lpMutexAttributes,
            bool InitialOwner,
            string MutexName);


        [DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]
        public static extern bool ReleaseMutex(IntPtr hMutex);


        #endregion


        public static bool IsInstanceRunning()
        {
            string strAppName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
            IntPtr hMutex = CreateMutex(IntPtr.Zero, true, strAppName);
            if (hMutex == IntPtr.Zero)
            {
                throw new ApplicationException("Failure creating mutex: " + Marshal.GetLastWin32Error().ToString("X"));
            }
            if (Marshal.GetLastWin32Error() == NATIVE_ERROR_ALREADY_EXISTS)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion


        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [MTAThread]
        static void Main()
        {
            if (IsInstanceRunning())//核心代碼
                MessageBox.Show("已經運行");
            else
                Application.Run(new MainF());
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章