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

ClickOnce应用无法通过「发送到」快捷方式启动的问题

解决ClickOnce WinForms应用「发送到」菜单不显示及参数传递失败问题

一、解决「发送到」菜单不显示问题

  • 刷新系统上下文菜单缓存:
    1. 打开任务管理器,找到「Windows资源管理器」进程,右键选择「重启」
    2. 或执行命令:ie4uinit.exe -show(运行对话框输入即可)
  • 验证快捷方式路径:确认Crawler.lnk确实在%APPDATA%\Microsoft\Windows\SendTo目录下,文件名无特殊字符

二、解决参数传递失败问题

直接指向.appref-ms文件的快捷方式无法接收「发送到」传递的文件参数,需通过中间脚本转发参数:

1. 生成中间启动脚本

在代码中创建批处理文件(或VBScript避免命令行窗口闪烁),用于转发参数到ClickOnce应用:

// 生成批处理文件路径
string launcherBatPath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    "CrawlerLauncher.bat"
);

string clickOnceAppPath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.Programs),
    "Crawler",
    "Crawler.appref-ms"
);

// 写入批处理内容,转发所有参数
File.WriteAllText(launcherBatPath, $@"@echo off
start """" ""{clickOnceAppPath}"" %*");

如果用VBScript替代,内容如下(代码中替换File.WriteAllText的内容):

Set WshShell = CreateObject("WScript.Shell")
Dim args : args = ""
For Each arg In WScript.Arguments
    args = args & " " & Chr(34) & arg & Chr(34)
Next
WshShell.Run Chr(34) & "{clickOnceAppPath}" & Chr(34) & args, 0, False

注意将{clickOnceAppPath}替换为实际的.appref-ms路径。

2. 创建指向脚本的快捷方式

修改原代码,让SendTo快捷方式指向生成的脚本文件:

string sendToPath = Environment.GetFolderPath(Environment.SpecialFolder.SendTo);
string shortcutPath = Path.Combine(sendToPath, "Crawler.lnk");

CreateShortcut(shortcutPath, launcherBatPath); // 若用VBScript则替换为VBS路径

3. 配置ClickOnce应用接收参数

  • 打开项目属性→「发布」→「选项」→「部署」,勾选「允许URL参数」
  • 在Program.cs中通过ClickOnce激活参数获取文件路径:
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // 获取「发送到」传递的文件路径
    string[] filePaths = Array.Empty<string>();
    var activationArgs = AppDomain.CurrentDomain.SetupInformation.ActivationArguments;
    if (activationArgs != null && activationArgs.ActivationData != null)
    {
        // 解析激活数据,去除前缀"file:///"
        filePaths = activationArgs.ActivationData
            .Select(path => new Uri(path).LocalPath)
            .ToArray();
    }

    Application.Run(new MainForm(filePaths));
}

在主窗体中处理filePaths数组即可。

内容的提问来源于stack exchange,提问作者Ibrahem Alhofe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:05:12