我有small project to handle tel:
protocol links。它是一个桌面应用程序,我使用Visual Studio 2013 Community Edition进行开发。
以前,我曾经使用简单的注册表修改来注册处理程序:
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);
但是,这似乎不再适用于Windows 8.虽然注册表项具有所需的值,但链接仍由不同的应用程序处理。我的工具甚至没有出现在协议处理程序选择中:
我查看了Walkthrough: Using Windows 8 Custom Protocol Activation,但我无法将上述信息与我的申请相关联。该文章提到了.appxmanifest
文件,我在项目中没有该文件,因此无法添加为新项目。
答案 0 :(得分:8)
在提出问题之后,我偶然发现了Registering a protocol handler in Windows 8
最高投票的答案让我走上正轨,尽管还有其他问题。最后,这就是我最终的结果:
// 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位,则所有这些都不会起作用。当条目在Wow6432Node中生成时,我无法选择处理程序作为给定协议的默认值。我花了一段时间来解决这个问题,因为我的应用程序编译为AnyCPU。我最初错过的是项目属性中的这个小旗: