在使用應用程式的過程中,經常要求應用程式只能執行一次。如果發現重複開啟,應從系統程式列表中搜尋到已經開啟的程式,並將該程式視窗移到最前端顯示。
記錄一下過程。
實現過程
在 Program.cs 檔案的 Program 類中宣告兩個外部呼叫函式
[DllImport("User32")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
兩個外部呼叫 User32.dll
檔案中的函式,其中SetForegroundWindow
主要用於將窗體移動到最前端顯示,ShowWindowAsync
函式用於顯示窗。
修改 main 函式內容
static void Main()
{
bool createdNew; //是否是第一次開啟程式
Mutex mutex = new Mutex(false, "Single", out createdNew);
mutex.WaitOne();
//例項化一個程式互斥變數,標記名稱Single
if (!createdNew) //如果多次開啟了程式
{
Process currentProcess = Process.GetCurrentProcess();//獲取當前程式
foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
{
//透過程式ID和程式路徑獲取一個已經開啟的程式
if ((process.Id != currentProcess.Id) &&
(Assembly.GetExecutingAssembly().Location == process.MainModule.FileName))
{
//獲取已經開啟的程式的主窗體控制程式碼
IntPtr mainFormHandle = process.MainWindowHandle;
if (mainFormHandle != IntPtr.Zero)
{
ShowWindowAsync(mainFormHandle, 1); //顯示已經開啟的程式視窗
SetForegroundWindow(mainFormHandle); //將已經開啟的程式視窗移動到前端
}
}
}
//MessageBox.Show("程式已經開啟");
return;
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainFrame());
mutex.ReleaseMutex(); //釋放Mutex一次
}
}
Mutex
類,該類位於System.Threading
名稱空間下,主要用於建立執行緒或程式的互斥變數。本例項建立了一個名為Single的互斥變數,在執行程式時,首先訪問該互斥變數,看該變數是否已經被建立,如果已經被建立,說明已經有相同的程式正在執行。
關於 Mutex鎖 :