真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

在衡陽縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),網(wǎng)絡(luò)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,衡陽縣網(wǎng)站建設(shè)費(fèi)用合理。

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

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

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

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

 

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

#region 防止多開
            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
                        {
                   // 如果窗體沒有隱藏,就直接切換到該窗體并帶入到前臺(tái)
                   // 因?yàn)榇绑w除了隱藏到托盤,還可以最小化
                            SwitchToThisWindow(proc.MainWindowHandle, true);
                        }
                    }
                }
       return;
            }
   #endregion
里面用到的幾個(gè)函數(shù)需要用到user32.dll庫文件。需要引用一下。
#region 方法四:使用的Win32函數(shù)的聲明

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

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

/////
        /////  設(shè)置窗口的顯示狀態(tài)
/////  Win32 函數(shù)定義為:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx
/////
        /////窗口句柄
        /////指示窗口如何被顯示
        /////如果窗體之前是可見,返回值為非零;如果窗體之前被隱藏,返回值為零
        [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        /// 

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


網(wǎng)站標(biāo)題:C#防止應(yīng)用多開
文章分享:http://weahome.cn/article/jdiegd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部