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

如何将自定义Windows Forms应用与浏览器URL关联且无需插件?

自定义Windows Forms应用关联自定义URL协议(无需浏览器插件)

完全可以无需浏览器插件实现,核心是通过Windows注册表注册自定义URL协议,让系统识别并关联到你的WinForms应用。以下是具体步骤:

一、注册自定义URL协议(系统级配置)

方式1:手动编辑注册表

  1. 打开注册表编辑器:按下Win+R,输入regedit后回车。
  2. 在HKEY_CLASSES_ROOT根节点下,右键新建项,命名为你的协议名(比如myprogram,对应URL里的myprogram:前缀)。
  3. 选中新建的myprogram项,设置默认值为URL:myprogram Protocol;再新建一个字符串值,命名为URL Protocol,值留空即可。
  4. 依次在myprogram下创建子项:shell → open → command。
  5. 选中command项,设置默认值为你的WinForms程序完整路径,加上参数占位符"%1",示例:
    "C:\Projects\MyProgram\bin\Release\MyProgram.exe" "%1"
    
    这里的%1会被系统替换为用户点击的完整URL(比如myprogram:?xt=myparams)。

方式2:通过代码自动注册(推荐)

如果希望程序启动时自动完成注册(需管理员权限),可以添加以下代码:

using Microsoft.Win32;

private static void RegisterCustomUrlProtocol()
{
    string protocolName = "myprogram";
    // 获取当前程序的完整路径
    string exeFullPath = System.Reflection.Assembly.GetExecutingAssembly().Location;

    using (RegistryKey rootKey = Registry.ClassesRoot.CreateSubKey(protocolName))
    {
        rootKey.SetValue("", $"URL:{protocolName} Protocol");
        rootKey.SetValue("URL Protocol", string.Empty);

        using (RegistryKey shellKey = rootKey.CreateSubKey("shell"))
        using (RegistryKey openKey = shellKey.CreateSubKey("open"))
        using (RegistryKey commandKey = openKey.CreateSubKey("command"))
        {
            commandKey.SetValue("", $"\"{exeFullPath}\" \"%1\"");
        }
    }
}

调用此方法前需确保程序以管理员身份运行,可在项目属性的“安全性”中勾选“启用ClickOnce安全设置”,再调整权限为“完全信任”。

二、在WinForms应用中接收并解析参数

系统会把完整的URL作为命令行参数传递给你的程序,只需在Main方法中处理:

static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Dictionary<string, string> parameters = null;
    // 检查是否有传入的URL参数
    if (args.Length > 0)
    {
        string incomingUrl = args[0];
        // 提取?后的查询字符串
        if (incomingUrl.Contains("?"))
        {
            string queryPart = incomingUrl.Substring(incomingUrl.IndexOf("?") + 1);
            // 拆分键值对并转为字典
            parameters = queryPart.Split('&')
                                  .Select(pair => pair.Split('='))
                                  .ToDictionary(kv => kv[0], kv => kv[1]);
        }
    }

    // 将参数传递给主窗体
    Application.Run(new MainForm(parameters));
}

然后修改主窗体的构造函数,接收并使用参数:

public MainForm(Dictionary<string, string> paramsDict = null)
{
    InitializeComponent();
    if (paramsDict != null && paramsDict.ContainsKey("xt"))
    {
        // 示例:显示收到的参数
        MessageBox.Show($"获取到参数xt: {paramsDict["xt"]}");
        // 也可以将参数绑定到控件,比如txtParam.Text = paramsDict["xt"];
    }
}

三、测试与注意事项

  1. 注册完成后,可能需要重启浏览器或系统才能让新的URL协议生效。
  2. 点击浏览器中的<a href="myprogram:?xt=myparams">Open my program</a>链接,系统会自动启动你的WinForms应用并传递参数。
  3. 若要取消关联,只需打开注册表编辑器,删除HKEY_CLASSES_ROOT下的myprogram项即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:03:22