在Windows 8中注册协议处理程序

15

我正在尝试注册一个处理打开链接的应用程序,例如http://stackoverflow.com。我需要在Windows 8中显式地进行此操作,在较早版本的Windows中已经可以工作。根据MSDN,这在Win8中已更改。

我已经查看了 MSDN 上的“默认程序”页面(msdn.microsoft.com/en-us/library/cc144154.aspx)。它提供了一个很好的处理文件类型的步骤,但在协议方面缺乏细节。 注册应用程序到URL协议 只介绍了设置新协议所涉及的步骤,但没有介绍如何正确添加新的处理程序到现有协议。

我也尝试了其他 SO 帖子中概述的注册表设置。

还有一件事,该应用程序不是 Metro/Windows Store 应用程序,因此在清单中添加条目对我没有用。

3个回答

13

你在“默认程序”网页上是正确的轨迹 - 实际上,这是我发布此文章的参考。

以下是他们的示例改编:

首先,您需要在 HKLM\SOFTWARE\Classes 中拥有一个 ProgID,用于指定如何处理输入(您可能已经拥有它):

HKLM\SOFTWARE\Classes
     MyApp.ProtocolHandler //this is the ProgID, subkeys are its properties
        (Default) = My Protocol //name of any type passed to this
        DefaultIcon
           (Default) = %ProgramFiles%\MyApp\MyApp.exe, 0 //for example
        shell
           open
              command
                 (Default) = %ProgramFiles%\MyApp\MyApp.exe %1 //for example

然后在 Capabilities 键内填写 DefaultProgram 信息到注册表中:

HKLM\SOFTWARE\MyApp
    Capabilities
       ApplicationDescription
           URLAssociations
              myprotocol = MyApp.ProtocolHandler //Associated with your ProgID

最后,使用DefaultPrograms注册您的应用程序功能:

HKLM\SOFTWARE
      RegisteredApplications
         MyApplication = HKLM\SOFTWARE\MyApp\Capabilities

现在所有 "myprotocol:" 链接都应该触发 %ProgramFiles%\MyApp\MyApp.exe %1


我对这些概念非常陌生。你能告诉我如何运行上面的代码吗? - jammy
这不是代码。你需要了解如何访问Windows注册表。代码片段是注册表中的键和值。 - Ian Yates
如果您不确定您的协议是否已定义,您仍然需要像这样添加它:[HKEY_CLASSES_ROOT\myprotocol] (Default)="URL:myprotocol" "URL Protocol"="" - Daniel
请确保将您的exe路径和%1放在引号内,例如"program files\foo.exe" "%1" - slf

5

注意,这是在谷歌搜索时找到的一个顶级答案: 确保shell命令打开的路径是您应用程序的正确路径。我花了一整天时间调试这个问题,它似乎只影响Windows 10上的Chrome和Edge,而Firefox没有触发协议处理程序。 问题出在哪里呢? .bat文件的路径使用了混合\和/斜杠。 在路径中只使用正确的\斜杠会使Edge&Chrome突然能够接受该请求。


谢谢!一般来说,这样的事情应该保存在注释中。 - Arithmomaniac
这应该是对被接受答案的评论,因为它本身不是一个答案。 - MrTux

-4

LaunchUriAsync(Uri)

启动与指定URI相关联的URI方案名称的默认应用程序。 在这种情况下,您可以允许用户指定。

http://msdn.microsoft.com/library/windows/apps/Hh701476

        // Create the URI to launch from a string.
        var uri = new Uri(uriToLaunch);
        
        // Calulcate the position for the Open With dialog.
        // An alternative to using the point is to set the rect of the UI element that triggered the launch.
        Point openWithPosition = GetOpenWithPosition(LaunchUriOpenWithButton);
        
        // Next, configure the Open With dialog.
        // Here is where you choose the program.
        var options = new Windows.System.LauncherOptions();
        options.DisplayApplicationPicker = true;
        options.UI.InvocationPoint = openWithPosition;
        options.UI.PreferredPlacement = Windows.UI.Popups.Placement.Below;
        
        // Launch the URI.
        bool success = await Windows.System.Launcher.LaunchUriAsync(uri, options);
        if (success)
        {
           // URI launched: uri.AbsoluteUri
        }
        else
        {
            // URI launch failed.  uri.AbsoluteUri

        }
        

5
这段内容详细说明了如何通过URI启动应用程序。我的目的是注册我的应用程序,以便在另一个应用程序启动类似于这样的URI时启动它。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接