如何实现C#程序通过快捷方式启动时触发任务刷新功能?
实现方法
首先把刷新逻辑封装成公共方法,避免直接外部调用按钮点击操作,后续维护更方便:
// 放在你的主窗体类中 public void RefreshTaskList() { barButtonItem_Refresh.PerformClick(); }
接下来根据你当前的单实例实现方式,选择对应的方案:
方案1:使用WindowsFormsApplicationBase(WinForms推荐用这个,省心)
先在项目引用中添加Microsoft.VisualBasic程序集,然后改写Program.cs代码:
using Microsoft.VisualBasic.ApplicationServices; using System; using System.Windows.Forms; namespace 你的项目命名空间 { static class Program { [STAThread] static void Main(string[] args) { var app = new SingleInstanceApp(); app.Run(args); } } class SingleInstanceApp : WindowsFormsApplicationBase { public SingleInstanceApp() { IsSingleInstance = true; } protected override void OnCreateMainForm() { MainForm = new 你的主窗体类(); } protected override void OnStartupNextInstance(StartupNextInstanceEventArgs e) { base.OnStartupNextInstance(e); // 检查新实例是否带/refresh启动参数 bool needRefresh = e.CommandLine.Count > 0 && e.CommandLine[0].Equals("/refresh", StringComparison.OrdinalIgnoreCase); // 激活已运行的主窗口 MainForm.Show(); MainForm.WindowState = FormWindowState.Normal; MainForm.Activate(); // 如果是刷新请求,执行刷新 if (needRefresh && MainForm is 你的主窗体类 mainForm) { mainForm.RefreshTaskList(); } } } }
方案2:手动用Mutex实现单实例
如果之前是自己用Mutex写的单实例检测,可通过Windows消息传递刷新指令:
第一步:在主窗体中添加消息监听
using System.Runtime.InteropServices; public class 你的主窗体类 : Form { // 自定义消息ID,选一个不冲突的数值即可 public const int WM_REFRESH_TASKS = 0x0400 + 1; public void RefreshTaskList() { barButtonItem_Refresh.PerformClick(); } protected override void WndProc(ref Message m) { if (m.Msg == WM_REFRESH_TASKS) { RefreshTaskList(); } base.WndProc(ref m); } // 导入所需Windows API [DllImport("user32.dll")] private static extern bool SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); }
第二步:修改Program.cs的单实例检测逻辑
using System.Diagnostics; using System.Threading; static class Program { // 定义唯一互斥体名称,确保和其他程序不重复 private const string MutexName = "YourAppUniqueMutexIdentifier"; [STAThread] static void Main(string[] args) { bool isNewInstance; using (Mutex mutex = new Mutex(true, MutexName, out isNewInstance)) { if (isNewInstance) { // 首次启动,正常运行程序 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new 你的主窗体类()); } else { // 找到已运行的实例窗口 Process currentProcess = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) { if (process.Id != currentProcess.Id) { // 发送刷新消息给旧实例 SendMessage(process.MainWindowHandle, 你的主窗体类.WM_REFRESH_TASKS, IntPtr.Zero, IntPtr.Zero); // 恢复窗口并激活 ShowWindow(process.MainWindowHandle, 9); // SW_RESTORE SetForegroundWindow(process.MainWindowHandle); currentProcess.Close(); return; } } } } } // 重复导入API,或移至公共类中复用 [DllImport("user32.dll")] private static extern bool SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); }
最后一步:创建带参数的快捷方式
右键生成快捷方式,在目标栏的程序路径后添加 /refresh(注意前面有空格),示例:"C:\Program Files\你的程序目录\YourApp.exe" /refresh
点击该快捷方式时,新实例会检测到后台运行的旧实例,激活它并自动执行刷新操作,效果和手动点击刷新按钮完全一致。
内容的提问来源于stack exchange,提问作者Nikolay Tackeroff
相关产品推荐
相关产品推荐

