C# 如何在Windows 8上正确注册协议处理程序?

C# 如何在Windows 8上正确注册协议处理程序?,c#,windows-8,C#,Windows 8,我有一本书。这是一个桌面应用程序,我正在使用Visual Studio 2013社区版开发它 以前,我使用一个简单的注册表修改来注册处理程序: Microsoft.Win32.Registry.SetValue(registryKey, string.Empty, registryValue, Microsoft.Win32.RegistryValueKind.String); Microsoft.Win32.Registry.SetValue(registryKey, "URL Protoco

我有一本书。这是一个桌面应用程序,我正在使用Visual Studio 2013社区版开发它

以前,我使用一个简单的注册表修改来注册处理程序:

Microsoft.Win32.Registry.SetValue(registryKey, string.Empty, registryValue, Microsoft.Win32.RegistryValueKind.String);
Microsoft.Win32.Registry.SetValue(registryKey, "URL Protocol", String.Empty, Microsoft.Win32.RegistryValueKind.String);

registryKey = @"HKEY_CLASSES_ROOT\tel\shell\open\command";
registryValue = "\"" + AppDomain.CurrentDomain.BaseDirectory + "TelProtocolHandler.exe\" \"%1\"";
Microsoft.Win32.Registry.SetValue(registryKey, string.Empty, registryValue, Microsoft.Win32.RegistryValueKind.String);
然而,这似乎不再适用于Windows8。虽然注册表项具有所需的值,但链接仍由不同的应用程序处理。我的工具甚至没有出现在协议处理程序选择中:


我已经看过了,但是我不能把上面提到的信息和我的申请联系起来。这篇文章提到了一个
.appxmanifest
文件,我的项目中没有该文件,无法将其添加为新项目。

问了这个问题后,我无意中发现了它

尽管还有其他问题,但投票结果最高的答案让我走上了正确的道路。最后,这就是我的结局:

// Register as the default handler for the tel: protocol.
const string protocolValue = "TEL:Telephone Invocation";
Registry.SetValue(
    @"HKEY_CLASSES_ROOT\tel",
    string.Empty,
    protocolValue,
    RegistryValueKind.String );
Registry.SetValue(
    @"HKEY_CLASSES_ROOT\tel",
    "URL Protocol",
    String.Empty,
    RegistryValueKind.String );

const string binaryName = "tel.exe";
string command = string.Format( "\"{0}{1}\" \"%1\"", AppDomain.CurrentDomain.BaseDirectory, binaryName );
Registry.SetValue( @"HKEY_CLASSES_ROOT\tel\shell\open\command", string.Empty, command, RegistryValueKind.String );

// For Windows 8+, register as a choosable protocol handler.

// Version detection from https://stackoverflow.com/a/17796139/259953
Version win8Version = new Version( 6, 2, 9200, 0 );
if( Environment.OSVersion.Platform == PlatformID.Win32NT &&
    Environment.OSVersion.Version >= win8Version ) {
    Registry.SetValue(
        @"HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TelProtocolHandler",
        string.Empty,
        protocolValue,
        RegistryValueKind.String );
    Registry.SetValue(
        @"HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TelProtocolHandler\shell\open\command",
        string.Empty,
        command,
        RegistryValueKind.String );

    Registry.SetValue(
        @"HKEY_LOCAL_MACHINE\SOFTWARE\TelProtocolHandler\Capabilities\URLAssociations",
        "tel",
        "TelProtocolHandler",
        RegistryValueKind.String );
    Registry.SetValue(
        @"HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications",
        "TelProtocolHandler",
        @"SOFTWARE\TelProtocolHandler\Capabilities",
        RegistryValueKind.String );
}
TelProtocolHandler
是我的应用程序的名称,应替换为处理程序的名称

另一个问题中接受的答案在注册表中也有
ApplicationDescription
。对于我检查过的任何其他注册处理程序,我都没有看到相同的密钥,因此我忽略了它,无法检测到任何问题

另一个关键问题是,如果设置处理程序的应用程序是32位的,所有这些都将无法工作。在WOW6432节点中创建条目时,我无法选择处理程序作为给定协议的默认值。我花了一段时间才弄明白这一点,因为我的应用程序被编译为AnyCPU。我首先错过的是项目属性中的一个小标志:


您的应用程序是windows应用商店应用程序还是桌面应用程序?您使用的是哪个Visual Studio版本?|你对链接文章的哪一部分有问题?您应该能够在项目设置的协议列表中添加
tel:
,然后它应该显示在列表中,用户可以在列表中选择协议处理程序。@CodesInChaos:这是一个桌面应用程序。我正在使用VS2013社区版。这篇文章引用了一个清单文件,我的项目中没有这个文件,我似乎无法添加它。这篇文章明确提到了那个清单,我没有。