需求:1、點擊“關閉”按鈕時,程式最小化到托盤,並沒有退出,這時再次運行程式,不會重覆運行,而是顯示已運行的程式;2、支持不同目錄;3、支持修改名稱。代碼(不支持修改名稱,不支持不同目錄):using System;using System.Collections.Generic;using S.....
需求:1、點擊“關閉”按鈕時,程式最小化到托盤,並沒有退出,這時再次運行程式,不會重覆運行,而是顯示已運行的程式;2、支持不同目錄;3、支持修改名稱。
代碼(不支持修改名稱,不支持不同目錄):
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; using Tool; using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; namespace 計算器 { static class Program { [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); /// <summary> /// 該函數設置由不同線程產生的視窗的顯示狀態。 /// </summary> /// <param name="hWnd">視窗句柄</param> /// <param name="cmdShow">指定視窗如何顯示。查看允許值列表,請查閱ShowWlndow函數的說明部分。</param> /// <returns>如果函數原來可見,返回值為非零;如果函數原來被隱藏,返回值為零。</returns> [DllImport("User32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int cmdShow); /// <summary> /// 該函數將創建指定視窗的線程設置到前臺,並且激活該視窗。鍵盤輸入轉向該視窗,併為用戶改各種可視的記號。系統給創建前臺視窗的線程分配的許可權稍高於其他線程。 /// </summary> /// <param name="hWnd">將被激活並被調入前臺的視窗句柄。</param> /// <returns>如果視窗設入了前臺,返回值為非零;如果視窗未被設入前臺,返回值為零。</returns> [DllImport("User32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); private const int SW_SHOWNORMAL = 1; /// <summary> /// 應用程式的主入口點。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Process processes = RunningInstance(); if (processes == null) { Application.Run(new Form1()); } else { HandleRunningInstance(processes); } } /// <summary> /// 獲取正在運行的實例,沒有運行的實例返回null; /// </summary> public static Process RunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(current.ProcessName); foreach (Process process in processes) { if (process.Id != current.Id) { if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) { return process; } } } return null; } /// <summary> /// 顯示已運行的程式。 /// </summary> public static void HandleRunningInstance(Process instance) { try { IntPtr formHwnd = FindWindow(null, "計算器"); ShowWindow(formHwnd, SW_SHOWNORMAL); //顯示 SetForegroundWindow(formHwnd); //放到前端 } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }View Code
代碼(支持修改名稱,支持不同目錄):
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; using Tool; using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; namespace 計算器 { static class Program { [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); /// <summary> /// 該函數設置由不同線程產生的視窗的顯示狀態。 /// </summary> /// <param name="hWnd">視窗句柄</param> /// <param name="cmdShow">指定視窗如何顯示。查看允許值列表,請查閱ShowWlndow函數的說明部分。</param> /// <returns>如果函數原來可見,返回值為非零;如果函數原來被隱藏,返回值為零。</returns> [DllImport("User32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int cmdShow); /// <summary> /// 該函數將創建指定視窗的線程設置到前臺,並且激活該視窗。鍵盤輸入轉向該視窗,併為用戶改各種可視的記號。系統給創建前臺視窗的線程分配的許可權稍高於其他線程。 /// </summary> /// <param name="hWnd">將被激活並被調入前臺的視窗句柄。</param> /// <returns>如果視窗設入了前臺,返回值為非零;如果視窗未被設入前臺,返回值為零。</returns> [DllImport("User32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); private const int SW_SHOWNORMAL = 1; /// <summary> /// 應用程式的主入口點。 /// </summary> [STAThread] static void Main() { Common.AutoRegister(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); bool createNew; using (System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out createNew)) { if (createNew) { FileOperator.SetValue("ProcessId", Process.GetCurrentProcess().Id.ToString()); //進程ID寫入文件 Application.Run(new Form1()); } else { try { string strProcessId = FileOperator.GetValue("ProcessId"); //從文件中獲取進程ID int processId = Convert.ToInt32(strProcessId); Process process = Process.GetProcessById(processId); HandleRunningInstance(process); } catch { FileOperator.SetValue("ProcessId", Process.GetCurrentProcess().Id.ToString()); //進程ID寫入文件 Application.Run(new Form1()); } } } } /// <summary> /// 顯示已運行的程式。 /// </summary> public static void HandleRunningInstance(Process instance) { try { IntPtr formHwnd = FindWindow(null, "計算器"); ShowWindow(formHwnd, SW_SHOWNORMAL); //顯示 SetForegroundWindow(formHwnd); //放到前端 } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }View Code