如何在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¶m2=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
相关产品推荐
相关产品推荐

