溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#防止應(yīng)用多開(kāi)

發(fā)布時(shí)間:2020-07-17 06:30:37 來(lái)源:網(wǎng)絡(luò) 閱讀:627 作者:wzwyc 欄目:編程語(yǔ)言

有一些應(yīng)用,我們不希望被用戶多次打開(kāi)。那么我們需要在應(yīng)用的入口做一些處理。我把我應(yīng)用里的代碼貼出來(lái)。

1、如果只是需要,發(fā)現(xiàn)已經(jīng)打開(kāi)的時(shí)候,直接退出的話,用下面的代碼:

static void Main()
        {
            #region 防止多開(kāi)
            Process CurProc = Process.GetCurrentProcess();
            Process[] Procs = Process.GetProcessesByName(CurProc.ProcessName.Replace(".vshost", string.Empty));
            if (Procs.Length > 1)
            {
                MessageBox.Show("應(yīng)用已打開(kāi)", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            #endregion

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

相當(dāng)于在Main函數(shù)的開(kāi)始部分,判斷一下是否已經(jīng)有相同進(jìn)程,有的話,直接退出。

 

2、如果發(fā)現(xiàn)已經(jīng)打開(kāi)的話,退出當(dāng)前進(jìn)程,并且切換激活到前面打開(kāi)的進(jìn)程。那么需要用user32.dll庫(kù)文件里的函數(shù)。

#region 防止多開(kāi)
            Process CurProc = Process.GetCurrentProcess();
            Process[] Procs = Process.GetProcessesByName(CurProc.ProcessName.Replace(".vshost", string.Empty));
            if (Procs.Length > 1)
            {
                foreach (Process proc in Procs)
                {
                    if (proc.Id != CurProc.Id)
                    {
                        if (proc.MainWindowHandle.ToInt32() == 0)
                        {
                            // 獲得窗體句柄
                            formhwnd = FindWindow(null, "PictureManager");
                            // 重新顯示該窗體并切換到帶入到前臺(tái)
                            ShowWindow(formhwnd, SW_RESTORE);
                            SwitchToThisWindow(formhwnd, true);
                        }
                        else
                        {
                            // 如果窗體沒(méi)有隱藏,就直接切換到該窗體并帶入到前臺(tái)
                            // 因?yàn)榇绑w除了隱藏到托盤(pán),還可以最小化
                            SwitchToThisWindow(proc.MainWindowHandle, true);
                        }
                    }
                }
                return;
            }
            #endregion
里面用到的幾個(gè)函數(shù)需要用到user32.dll庫(kù)文件。需要引用一下。
#region 方法四:使用的Win32函數(shù)的聲明

        /// <summary>
        /// 找到某個(gè)窗口與給出的類別名和窗口名相同窗口
        /// 非托管定義為:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx
        /// </summary>
        /// <param name="lpClassName">類別名</param>
        /// <param name="lpWindowName">窗口名</param>
        /// <returns>成功找到返回窗口句柄,否則返回null</returns>
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// 切換到窗口并把窗口設(shè)入前臺(tái),類似 SetForegroundWindow方法的功能
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="fAltTab">True代表窗口正在通過(guò)Alt/Ctrl +Tab被切換</param>
        [DllImport("user32.dll ", SetLastError = true)]
        static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);

        ///// <summary>
        /////  設(shè)置窗口的顯示狀態(tài)
        /////  Win32 函數(shù)定義為:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx
        ///// </summary>
        ///// <param name="hWnd">窗口句柄</param>
        ///// <param name="cmdShow">指示窗口如何被顯示</param>
        ///// <returns>如果窗體之前是可見(jiàn),返回值為非零;如果窗體之前被隱藏,返回值為零</returns>
        [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
        public const int SW_RESTORE = 9;
        public static IntPtr formhwnd;
        #endregion        /// <summary>

注:用到user32.dll里面的函數(shù)以后,在用InstallShield Limited Edition制作安裝包的時(shí)候,會(huì)報(bào)錯(cuò),提示你添加user32.dll,目前我還沒(méi)有解決。所以現(xiàn)在是直接用方法1。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI