在使用應用程式的過程中,經常要求應用程式只能運行一次。如果發現重覆開啟,應從系統進程列表中搜索到已經開啟的進程,並將該進程視窗移到最前端顯示。 記錄一下過程。 實現過程 在 Program.cs 文件的 Program 類中聲明兩個外部調用函數 [DllImport("User32")] priva ...
在使用應用程式的過程中,經常要求應用程式只能運行一次。如果發現重覆開啟,應從系統進程列表中搜索到已經開啟的進程,並將該進程視窗移到最前端顯示。
記錄一下過程。
實現過程
在 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鎖 :