代码之家  ›  专栏  ›  技术社区  ›  Danny Tuppeny

如何在Windows(8.1)中将自定义应用程序注册为Web浏览器?

  •  2
  • Danny Tuppeny  · 技术社区  · 11 年前

    我正在尝试注册我自己的应用程序,以便它显示在列表中,以便使用我找到的信息在Windows中选择默认浏览器 around the internet 。代码运行时没有问题,似乎创建了正确的注册表项,但我的应用程序在Windows 8.1的浏览器选择选项中没有显示。

    我还没有设置 UserChoice 在一些在线代码示例中显示的值,因为看起来它实际上设置了默认浏览器(只有一个值),我不想这么做,只将其注册为选项。

    相关代码在RegisterBrowser中,但为了方便起见,我已经包含了完整的类。

    using System;
    using System.Reflection;
    using Microsoft.Win32;
    
    namespace MyApp
    {
        class Program
        {
            const string AppID = "MyApp";
            const string AppName = "My App";
            const string AppDescription = "My App";
            static string AppPath = Assembly.GetExecutingAssembly().Location;
            static string AppIcon = AppPath + ",0";
            static string AppOpenUrlCommand = AppPath + " %1";
            static string AppReinstallCommand = AppPath + " --register";
    
            static void Main(string[] args)
            {
                if (args == null || args.Length != 1 || !HandleArg(args[0]))
                    ShowHelpInfo();
            }
    
            static bool HandleArg(string arg)
            {
                if (string.Equals(arg, "--register", StringComparison.OrdinalIgnoreCase))
                    RegisterBrowser();
                else if (string.Equals(arg, "--unregister", StringComparison.OrdinalIgnoreCase))
                    UnregisterBrowser();
                else if (arg.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || arg.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || arg.StartsWith("ftp://", StringComparison.OrdinalIgnoreCase))
                    LaunchBrowser(arg);
                else
                    return false;
    
                return true;
            }
    
            static void ShowHelpInfo()
            {
                Console.WriteLine("Usage:");
                Console.WriteLine("    MyApp.exe --register               Register as web browser");
                Console.WriteLine("    MyApp.exe --unregister             Unregister as web browser");
                Console.WriteLine("    MyApp.exe \"http://example.org/\"  Launch example.org in specified browser");
            }
    
            static void RegisterBrowser()
            {
                // Register application.
                var appReg = Registry.LocalMachine.CreateSubKey(string.Format("SOFTWARE\\Clients\\StartMenuInternet\\{0}", AppID));
                appReg.SetValue("", AppName);
                appReg.CreateSubKey("DefaultIcon").SetValue("", AppIcon);
                appReg.CreateSubKey("shell\\open\\command").SetValue("", AppOpenUrlCommand);
    
                // Install info.
                var appInstallInfo = appReg.CreateSubKey("InstallInfo");
                appInstallInfo.SetValue("IconsVisible", 1);
                appInstallInfo.SetValue("ShowIconsCommand", AppPath); // TOOD: Do I need to support this?
                appInstallInfo.SetValue("HideIconsCommand", AppPath); // TOOD: Do I need to support this?
                appInstallInfo.SetValue("ReinstallCommand", AppReinstallCommand);
    
                // Register capabilities.
                var capabilityReg = appReg.CreateSubKey("Capabilities");
                capabilityReg.SetValue("ApplicationName", AppName);
                capabilityReg.SetValue("ApplicationIcon", AppIcon);
                capabilityReg.SetValue("ApplicationDescription", AppDescription);
    
                // Set up protocols we want to handle.
                var urlAssoc = capabilityReg.CreateSubKey("URLAssociations");
                urlAssoc.SetValue("http", AppID);
                urlAssoc.SetValue("https", AppID);
                urlAssoc.SetValue("ftp", AppID);
            }
    
            static void UnregisterBrowser()
            {
                Registry.LocalMachine.DeleteSubKeyTree(string.Format("SOFTWARE\\Clients\\StartMenuInternet\\{0}", AppID), false);
            }
    
            static void LaunchBrowser(string arg)
            {
                Console.WriteLine(arg);
                Console.ReadLine();
            }
        }
    }
    
    1 回复  |  直到 9 年前
        1
  •  8
  •   Buildstarted    11 年前

    我不知道具体的代码,但如果您只需要一个注册表文件,您可以执行以下操作:(它将用默认程序注册您的应用程序,并为您设置所有处理程序)

    Windows Registry Editor Version 5.00
    
    ; Infamous capabilities:
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\Capabilities]
    "ApplicationDescription"="MyApp"
    "ApplicationIcon"="C:\\MyApp\\MyApp.exe,0"
    "ApplicationName"="MyApp"
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\Capabilities\FileAssociations]
    ".htm"="MyAppURL"
    ".html"="MyAppURL"
    ".shtml"="MyAppURL"
    ".xht"="MyAppURL"
    ".xhtml"="MyAppURL"
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\Capabilities\URLAssociations]
    "ftp"="MyAppURL"
    "http"="MyAppURL"
    "https"="MyAppURL"
    
    ; Register to Default Programs
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications]
    "MyApp"="Software\\MyApp\\Capabilities"
    
    ; MyAppURL HANDLER:
    
    [HKEY_LOCAL_MACHINE\Software\Classes\MyAppURL]
    @="MyApp Document"
    "FriendlyTypeName"="MyApp Document"
    
    [HKEY_LOCAL_MACHINE\Software\Classes\MyAppURL\shell]
    
    [HKEY_LOCAL_MACHINE\Software\Classes\MyAppURL\shell\open]
    
    [HKEY_LOCAL_MACHINE\Software\Classes\MyAppURL\shell\open\command]
    @="\"C:\\MyApp\\MyApp.exe\" \"%1\""