Winform 程式多開

BoiledYakult發表於2023-02-23

在使用應用程式的過程中,經常要求應用程式只能執行一次。如果發現重複開啟,應從系統程式列表中搜尋到已經開啟的程式,並將該程式視窗移到最前端顯示。

記錄一下過程。

實現過程

在 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鎖 :

C# 針對特定的條件進行鎖操作,不用lock,而是mutex

c# 如何針對特定的條件進行鎖操作?

C# 多執行緒系列之Mutex使用

相關文章