国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# 禁止應用程序多次啟動的實例

2020-01-24 03:09:40
字體:
來源:轉載
供稿:網友

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

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

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

復制代碼 代碼如下:

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

            //每次啟動應用程序,都會驗證名稱為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>
        /// 查看程序是否已經運行
        /// </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);
    }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁远县| 内丘县| 奉化市| 松潘县| 长丰县| 广宁县| 库伦旗| 克山县| 安丘市| 阳春市| 洪江市| 杂多县| 东安县| 黄浦区| 无棣县| 沂源县| 吴江市| 宜川县| 沿河| 孝昌县| 郎溪县| 砚山县| 英吉沙县| 阳东县| 平塘县| 河间市| 双辽市| 繁昌县| 塘沽区| 精河县| 湟中县| 龙里县| 买车| 贵溪市| 江城| 阜新市| 甘孜| 普兰县| 新闻| 都兰县| 贵定县|