You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:36:05