亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多個線程同步訪問的一個類。它非常類似了Monitor類,因?yàn)樗麄兌贾挥幸粋€線程能擁有鎖定。而操作系統(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)用程序,都會驗(yàn)證名稱為SingletonWinAppMutex的互斥是否存在
            Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);
           
            //如果已運(yùn)行,則在前端顯示
            //createdNew == false,說明程序已運(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)文章

最新評論