c#只執行一個示例,並把當前程式 顯示到最桌面
阿新 • • 發佈:2020-09-07
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);
}
}