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

如何在C#应用通过自定义URL协议启动时获取URL携带的参数

问题原因和解决方法

1. 最常见原因:注册表配置缺失参数传递占位符

你在配置自定义URL协议的注册表项时,HKEY_CLASSES_ROOT\自定义协议名\shell\open\command的默认值必须包含"%1"占位符,示例正确配置值:
"C:\path\to\your\app.exe" "%1"

注意:%1必须用英文双引号包裹,避免URL中包含空格等特殊字符时参数被截断。
如果漏了"%1",系统启动应用时不会把完整URL作为参数传入,自然args数组为空。

2. 替代获取参数的方法

如果确认注册表配置正确仍无法通过Main方法的args拿到参数,可以使用.NET内置的Environment.GetCommandLineArgs()方法获取全量命令行参数:

// 返回的数组第一个元素固定为当前应用的 exe 完整路径
string[] allArgs = Environment.GetCommandLineArgs();
if (allArgs.Length >= 2)
{
    // 第二个元素就是完整的自定义URL,比如customurl://param1=xy&param2=xy
    string fullCustomUrl = allArgs[1];
    
    // 规范解析参数建议用Uri类 + HttpUtility
    Uri uri = new Uri(fullCustomUrl);
    var parameters = System.Web.HttpUtility.ParseQueryString(uri.Query);
    string param1 = parameters["param1"];
    string param2 = parameters["param2"];
    // 这里就可以拿到解析后的参数值了
}

注意:如果项目中没有引入System.Web命名空间,需要先在项目引用中添加System.Web程序集,或者用第三方的URL解析库替代。

3. 特殊场景适配:单实例应用

如果你的应用做了单实例启动限制,新的启动请求触发时,系统会拉起新进程但很快被你自己的单实例逻辑终止,这种情况下需要额外做进程间通信,把新进程拿到的URL参数传递给已经在运行的旧实例,再终止新进程即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:36:05