我正在尝试注册我的应用程序,该应用程序将处理链接的打开,例如,http://stackoverflow.com。 我需要为 Windows 8 明确执行此操作,我在早期版本的 Windows 中运行它。 根据MSDN的说法,这在Win8中已经发生了变化。
我已经浏览了 MSDN 上的 MSDN (msdn.microsoft.com/en-us/library/cc144154.aspx) 页面上的默认程序页面。 它提供了处理文件类型的出色演练,但对协议的详细信息很轻。 将应用程序注册到 URL 协议仅涉及设置新协议所涉及的步骤,而不介绍如何将新处理程序正确添加到现有协议。
我还尝试了其他SO帖子中概述的注册表设置。
还有一件事,该应用程序不是 Metro/Windows 应用商店应用程序,因此在清单中添加条目对我不起作用。
您在默认程序网页上走在正确的轨道上 - 事实上,这是我对这篇文章的参考。
下面改编他们的示例:
首先,您需要一个HKLMSOFTWAREClasses
ProgID
,用于说明如何处理提供给它的任何输入(您的输入可能已经存在):
HKLMSOFTWAREClasses
MyApp.ProtocolHandler //this is the ProgID, subkeys are its properties
(Default) = My Protocol //name of any type passed to this
DefaultIcon
(Default) = %ProgramFiles%MyAppMyApp.exe, 0 //for example
shell
open
command
(Default) = %ProgramFiles%MyAppMyApp.exe %1 //for example
然后在Capabilities
项中使用 DefaultProgram 信息填充注册表:
HKLMSOFTWAREMyApp
Capabilities
ApplicationDescription
URLAssociations
myprotocol = MyApp.ProtocolHandler //Associated with your ProgID
最后,向 DefaultProgram 注册应用程序的功能:
HKLMSOFTWARE
RegisteredApplications
MyApplication = HKLMSOFTWAREMyAppCapabilities
现在所有"myprotocol:"链接都应该触发%ProgramFiles%MyAppMyApp.exe %1
。
旁注,因为这是谷歌搜索此类问题时发现的最佳答案:确保 shell 命令打开中的路径是应用程序的正确路径。我花了一整天的时间调试问题,这似乎只影响Windows 10上的Chrome和Edge。他们从未像 Firefox 那样触发协议处理程序。问题出在哪里?混合使用的.bat文件的路径 \ 和/斜杠。在路径中只使用适当的\斜杠使Edge&Chrome突然能够接收请求。
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
}