有一些應用,咱們不但願被用戶屢次打開。那麼咱們須要在應用的入口作一些處理。我把我應用裏的代碼貼出來。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