欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 禁止應(yīng)用程序多次啟動(dòng)的實(shí)例

 更新時(shí)間:2013年09月06日 16:09:49   投稿:shangke  
經(jīng)常我們會(huì)有這樣的需求,只讓?xiě)?yīng)用程序運(yùn)行一個(gè)實(shí)體,下面是實(shí)現(xiàn)的方法,有需要的朋友可以參考一下

通常我們的情況是,雙擊一個(gè)exe文件,就運(yùn)行一個(gè)程序的實(shí)體,再雙擊一次這個(gè)exe文件,又運(yùn)行這個(gè)應(yīng)用程序的另一個(gè)實(shí)體。就拿QQ游戲來(lái)說(shuō)吧,一臺(tái)電腦上一般只能運(yùn)行一個(gè)QQ游戲大廳。

那我們的程序也能像QQ游戲那里禁止多次啟動(dòng)嗎,答案是可以的,下面介紹下一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方法,那就是Mutex(互斥)。

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多個(gè)線程同步訪問(wèn)的一個(gè)類(lèi)。它非常類(lèi)似了Monitor類(lèi),因?yàn)樗麄兌贾挥幸粋€(gè)線程能擁有鎖定。而操作系統(tǒng)能夠識(shí)別有名稱的互斥,我們可以給互斥一個(gè)唯一的名稱,在程序啟動(dòng)之前加一個(gè)這樣的互斥。這樣每次程序啟動(dòng)之前,都會(huì)檢查這個(gè)命名的互斥是否存在。如果存在,應(yīng)用程序就退出。

復(fù)制代碼 代碼如下:

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool createdNew;
            //系統(tǒng)能夠識(shí)別有名稱的互斥,因此可以使用它禁止應(yīng)用程序啟動(dòng)兩次
            //第二個(gè)參數(shù)可以設(shè)置為產(chǎn)品的名稱:Application.ProductName

            //每次啟動(dòng)應(yīng)用程序,都會(huì)驗(yàn)證名稱為SingletonWinAppMutex的互斥是否存在
            Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);
           
            //如果已運(yùn)行,則在前端顯示
            //createdNew == false,說(shuō)明程序已運(yùn)行
            if (!createdNew)
            {
                Process instance = GetExistProcess();
                if (instance != null)
                {
                    SetForegroud(instance);
                    Application.Exit();
                    return;
                }
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        /// <summary>
        /// 查看程序是否已經(jīng)運(yùn)行
        /// </summary>
        /// <returns></returns>
        private static Process GetExistProcess()
        {
            Process currentProcess = Process.GetCurrentProcess();
            foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
            {
                if ((process.Id != currentProcess.Id) &&
                    (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
                {
                    return process;
                }
            }
            return null;
        }

        /// <summary>
        /// 使程序前端顯示
        /// </summary>
        /// <param name="instance"></param>
        private static void SetForegroud(Process instance)
        {
            IntPtr mainFormHandle = instance.MainWindowHandle;
            if (mainFormHandle != IntPtr.Zero)
            {
                ShowWindowAsync(mainFormHandle, 1);
                SetForegroundWindow(mainFormHandle);
            }
        }

        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    }

相關(guān)文章

最新評(píng)論