WinFrom 隻能運作一個執行個體以及全局異常處理
using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
static class Program
{
/// <summary>
/// 應用程式的主入口點。
/// </summary>
[STAThread]
static void Main()
{
bool _bInitiallyOwned = true;
bool _bIsCreated;
Mutex m = new Mutex(_bInitiallyOwned, "ce08415e ", out _bIsCreated);
if (!(_bInitiallyOwned && _bIsCreated))
{
MessageBox.Show("已有一個程式的執行個體在運作。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();
}
else
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
#region 最進階别的異常處理情況
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(TopLevelExceptionHandler);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
#endregion
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
MessageBox.Show("非常抱歉,系統出現異常,請重新啟動系統。", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
/// <summary>
/// 最進階别異常處理情況
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private static void TopLevelExceptionHandler(object sender, UnhandledExceptionEventArgs args)
}
}
C# WinForm 隻允許運作一個執行個體 ,如果有就激活到前段
C# WinForm 如果已經有其執行個體在運作,再運作新的執行個體就隻閃一下螢幕,什麼也看不到,導緻不知所錯。其實它的執行個體已經在“任務管理器”中,如果想結束它,可以按以下三個組合鍵 Ctrl + Alt + Del,點選其中的“任務管理器”進入Windows任務管理器,再點選“程序”頁面,點選你的程序,再按“結束程序”将其結束。
以下代碼隻允許 C# WinForm 運作一個執行個體 ,如果已經有其執行個體在運作,就将其視窗激活到前段顯示。
主要代碼如下:
//隻運作一個執行個體
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;
namespace WindowsFormsINI
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//1.這裡判定是否已經有執行個體在運作
//隻運作一個執行個體
Process instance = RunningInstance();
if (instance == null)
//1.1 沒有執行個體在運作
//1.2 已經有一個執行個體在運作
HandleRunningInstance(instance);
//2.在程序中查找是否已經有執行個體在運作
#region 確定程式隻運作一個執行個體
private static Process RunningInstance()
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//周遊與目前程序名稱相同的程序清單
foreach (Process process in processes)
//如果執行個體已經存在則忽略目前程序
if (process.Id != current.Id)
{
//保證要打開的程序同已經存在的程序來自同一檔案路徑
if (Assembly.GetExecutingAssembly().Location.Replace("/",@"\") == current.MainModule.FileName)
{
//傳回已經存在的程序
return process;
}
}
return null;
//3.已經有了就把它激活,并将其視窗放置最前端
private static void HandleRunningInstance(Process instance)
MessageBox.Show("已經在運作!", "提示資訊", MessageBoxButtons.OK, MessageBoxIcon.Information);
ShowWindowAsync(instance.MainWindowHandle, 1); //調用api函數,正常顯示視窗
SetForegroundWindow(instance.MainWindowHandle); //将視窗放置最前端
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
private static extern bool SetForegroundWindow(System.IntPtr hWnd);
#endregion
C# WinForm 隻運作一個程式執行個體
方法一:
//沒有執行個體在運作
//已經有一個執行個體在運作
//周遊與目前程序名稱相同的程序清單
//如果執行個體已經存在則忽略目前程序
{
方法二:
bool ret;
System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out ret);
if (ret)
System.Windows.Forms.Application.EnableVisualStyles(); //這兩行實作 XP 可視風格
System.Windows.Forms.Application.DoEvents();
System.Windows.Forms.Application.Run(new Form1());
// frmMain 為你程式的主窗體,如果是控制台程式不用這句
m.ReleaseMutex();
MessageBox.Show(null, "有一個和本程式相同的應用程式已經在運作,請不要同時運作多個本程式。\n\n這個程式即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
// 提示資訊,可以删除。
Application.Exit();//退出程式