C#防止应用多开

有一些应用,咱们不但愿被用户屡次打开。那么咱们须要在应用的入口作一些处理。我把我应用里的代码贴出来。windows

一、若是只是须要,发现已经打开的时候,直接退出的话,用下面的代码:ide

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

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

至关于在Main函数的开始部分,判断一下是否已经有相同进程,有的话,直接退出。函数

 

二、若是发现已经打开的话,退出当前进程,而且切换激活到前面打开的进程。那么须要用user32.dll库文件里的函数。spa

#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");
                            // 从新显示该窗体并切换到带入到前台
                            ShowWindow(formhwnd, SW_RESTORE);
                            SwitchToThisWindow(formhwnd, true);
                        }
                        else
                        {
                            // 若是窗体没有隐藏,就直接切换到该窗体并带入到前台
                            // 由于窗体除了隐藏到托盘,还能够最小化
                            SwitchToThisWindow(proc.MainWindowHandle, true);
                        }
                    }
                }
                return;
            }
            #endregion
里面用到的几个函数须要用到user32.dll库文件。须要引用一下。
#region 方法四:使用的Win32函数的声明

        /// <summary>
        /// 找到某个窗口与给出的类别名和窗口名相同学口
        /// 非托管定义为: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>
        /// 切换到窗口并把窗口设入前台,相似 SetForegroundWindow方法的功能
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="fAltTab">True表明窗口正在经过Alt/Ctrl +Tab被切换</param>
        [DllImport("user32.dll ", SetLastError = true)]
        static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);

        ///// <summary>
        /////  设置窗口的显示状态
        /////  Win32 函数定义为:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx
        ///// </summary>
        ///// <param name="hWnd">窗口句柄</param>
        ///// <param name="cmdShow">指示窗口如何被显示</param>
        ///// <returns>若是窗体以前是可见,返回值为非零;若是窗体以前被隐藏,返回值为零</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里面的函数之后,在用InstallShield Limited Edition制做安装包的时候,会报错,提示你添加user32.dll,目前我尚未解决。因此如今是直接用方法1。code

相关文章
相关标签/搜索