ClickOnce应用无法通过「发送到」快捷方式启动的问题
解决ClickOnce WinForms应用「发送到」菜单不显示及参数传递失败问题
一、解决「发送到」菜单不显示问题
- 刷新系统上下文菜单缓存:
- 打开任务管理器,找到「Windows资源管理器」进程,右键选择「重启」
- 或执行命令:
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
相关产品推荐
相关产品推荐

