2014-12-02 169 views
5

我有一個small project to handle tel: protocol links。這是一個桌面應用程序,我正在使用Visual Studio 2013 Community Edition進行開發。如何在Windows 8上正確註冊協議處理程序?

以前,我用一個簡單的註冊表修改註冊的處理程序:

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的工作,而該註冊表項具有所需的值,該環節還由不同的應用程序處理。我的工具甚至沒有出現在協議處理程序的選擇:

enter image description here

我已經看了Walkthrough: Using Windows 8 Custom Protocol Activation,但我可以不涉及所提到的信息,我的應用程序。文章提到了一個.appxmanifest文件,我沒有在我的項目中,並且無法添加爲新項目。

+0

是您的應用程序在Windows商店應用程序或桌面應用程序?你正在使用哪個Visual Studio版本? |鏈接文章的哪一部分有問題?您應該可以在項目設置的協議列表中添加'tel:',然後它將顯示在用戶可以選擇協議處理程序的列表中。 – CodesInChaos 2014-12-02 11:49:54

+0

@CodesInChaos:這是一個桌面應用程序。我正在使用VS2013社區版。這篇文章引用了一個清單文件,我沒有在我的項目中使用這個清單文件,而且我似乎無法添加它。這篇文章明確提到了那個我沒有的清單。 – 2014-12-02 11:57:20

回答

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。我第一次錯過了這個小標誌在項目屬性:

enter image description here

相關問題