1. 程式人生 > 實用技巧 >c#只執行一個示例,並把當前程式 顯示到最桌面

c#只執行一個示例,並把當前程式 顯示到最桌面

c#只執行一個示例,並把當前程式 顯示到最桌面

最近程式寫的有問題,需要只執行一個例項,於是上網查 發現有兩個方法,一個就是使用互斥量(System.Threading.Mutex),另一個就是使用程序名。

具體方法如下

互斥量

bool createNew;
using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
{
   if (createNew)
   {
       //這裡寫你需要執行的主程式
   }
   else
   {
       MessageBox.Show("應用程式已經在執行中...")
       System.Environment.Exit(0);
   }
 }

程序名

Process[] processes = System.Diagnostics.Process.GetProcessesByName(Application.CompanyName);
 if (processes.Length > 1)
 {
     MessageBox.Show("應用程式已經在執行中。。");
     System.Environment.Exit(0);
 }
 else
 {
    //這裡寫你需要執行的主程式
 }

但是這兩種方法都是會提示你 有一個程序正在運行了,對於有使用者介面的操作來說 十分不友好,最好是 如果有程式已經在運行了直接把正在執行的程式擺在桌面上,這樣感覺就會更友好一些,程式碼如下

需要呼叫win32 的api

#region <<視窗狀態碼>>
/// <summary>
/// 關閉視窗
/// </summary>
private const int WIN_CLOSE = 0;
/// <summary>
///  正常大小顯示視窗
/// </summary>
private const int WIN_NOMAIL = 1;
/// <summary>
/// 最小化視窗
/// </summary>
private const int WIN_MIN = 2;
/// <summary>
/// 最大化視窗
/// </summary>
private const int WIN_MAX = 3;

#endregion

#region <<win32 api>>

/// <summary>
/// 該函式設定由不同執行緒產生的視窗的顯示狀態
/// </summary>
/// <param name="hWnd">視窗控制代碼</param>
/// <param name="cmdShow">指定視窗如何顯示。檢視允許值列表,請查閱ShowWlndow函式的說明部分</param>
/// <returns>如果函式原來可見,返回值為非零;如果函式原來被隱藏,返回值為零</returns>
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

/// <summary>
///  該函式將建立指定視窗的執行緒設定到前臺,並且啟用該視窗。鍵盤輸入轉向該視窗,併為使用者改各種可視的記號。
///  系統給建立前臺視窗的執行緒分配的許可權稍高於其他執行緒。 
/// </summary>
/// <param name="hWnd">將被啟用並被調入前臺的視窗控制代碼</param>
/// <returns>如果視窗設入了前臺,返回值為非零;如果視窗未被設入前臺,返回值為零</returns>
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

/// <summary>
/// 把視窗展示出來
/// </summary>
/// <param name="hwnd">視窗控制代碼</param>
/// <param name="nCmdShow">視窗狀態碼</param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

#endregion

#region<<封裝函式>>

 /// <summary>
 /// 將程序的視窗顯示到桌面最前端
 /// </summary>
 /// <param name="instance">程序</param>
 private static void HandleRunningInstance(Process instance)
 {
    /*這裡需要注意的是 根據自己的需要決定使用 ShowWindowAsync 還是 ShowWindow */

	ShowWindowAsync(instance.MainWindowHandle, WIN_NOMAIL);
    
    SetForegroundWindow(instance.MainWindowHandle);
			         
 }

 /// <summary>
 /// 查詢當前程序是否有跟自己一樣的程序
 /// </summary>
 /// <returns>程序</returns>
 private static Process RuningInstance()
 {
    Process currentProcess = Process.GetCurrentProcess();
    Process[] Processes = Process.GetProcessesByName(currentProcess.ProcessName);
    foreach (Process process in Processes)
    {
      if (process.Id != currentProcess.Id)
      {
        if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == currentProcess.MainModule.FileName)
          {
              return process;
          }
      }

    }
    return null;
  }

#endregion

呼叫方法

public static void Main(string[] args)
{ 
   /*判斷是不是重複開啟本程式*/
   Process process = RuningInstance();
   if (process == null)
   {
	   /*程序種沒有前程式,new一個新例項來執行(App 是你要執行的主程式)*/
       App app = new App();
       app.Run();
   }

   else
   {
	   /*程序種有當前程式,把找的的程序啟用,並顯示到桌面上*/
       HandleRunningInstance(process);
   }
}