最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多個線程同步訪問的一個類。它非常類似了Monitor類,因為他們都只有一個線程能擁有鎖定。而操作系統(tǒng)能夠識別有名稱的互斥,我們可以給互斥一個唯一的名稱,在程序啟動之前加一個這樣的互斥。這樣每次程序啟動之前,都會檢查這個命名的互斥是否存在。如果存在,應(yīng)用程序就退出。

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

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

            //每次啟動應(yīng)用程序,都會驗證名稱為SingletonWinAppMutex的互斥是否存在
            Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);
           
            //如果已運行,則在前端顯示
            //createdNew == false,說明程序已運行
            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)運行
        /// </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)文章

最新評論

汤原县| 萨迦县| 宜宾县| 巴南区| 阳信县| 祁阳县| 海丰县| 龙山县| 奉新县| 芷江| 会同县| 云南省| 高淳县| 壤塘县| 开封县| 朝阳市| 长岛县| 密山市| 六枝特区| 揭西县| 临海市| 沅江市| 连南| 亳州市| 新田县| 永平县| 邢台县| 慈溪市| 民和| 游戏| 海林市| 泰安市| 靖宇县| 太原市| 军事| 潼南县| 会昌县| 邹城市| 婺源县| 化隆| 白沙|