2014-12-02 17 views
5

Mam small project to handle tel: protocol links. Jest to aplikacja komputerowa, którą rozwijam przy użyciu Visual Studio 2013 Community Edition.Jak poprawnie zarejestrować program obsługi protokołu w systemie Windows 8?

Wcześniej użyłem zarejestrować obsługi z prostą modyfikację rejestru:

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); 

to jednak nie wydaje się działać na Windows 8. Podczas gdy klucz rejestru ma żądaną wartość, linki są nadal obsługiwane przez inną aplikację. Mój narzędzie nie pojawiają się nawet w doborze obsługi protokołu:

enter image description here

Szukałem na Walkthrough: Using Windows 8 Custom Protocol Activation, ale nie może dotyczyć tych danych do mojej aplikacji. W artykule wymieniono plik .appxmanifest, którego nie ma w moim projekcie i nie można go dodać jako nowego elementu.

+0

Czy aplikacja aplikacja sklep okna lub aplikacją? Którą wersję Visual Studio używasz? | Z którą częścią połączonego artykułu masz problemy? Powinieneś móc dodać 'tel:' na liście protokołów ustawień twojego projektu, a następnie powinien pojawić się na liście, gdzie użytkownik może wybrać procedurę obsługi protokołu. – CodesInChaos

+0

@CodesInChaos: To aplikacja na komputer. Używam wersji społecznościowej VS2013. Artykuł odwołuje się do pliku manifestu, którego nie mam w moim projekcie i którego nie mogę dodać. Artykuł wyraźnie odnosi się do tego manifestu, którego ja nie mam. –

Odpowiedz

8

Po zadać pytanie, natknąłem się Registering a protocol handler in Windows 8

Górny głosowało odpowiedź nie masz mnie na właściwe tory, choć były też inne problemy. W końcu to, co skończyło się z:

// 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 to nazwa mojego wniosku i powinien zostać zastąpiony przez co nazwa programu obsługi jest.

Przyjęta odpowiedź w drugim pytaniu ma również numer ApplicationDescription w rejestrze. Nie widziałem tego samego klucza dla żadnej z innych zarejestrowanych procedur obsługi, które sprawdziłem, więc pominąłam go i nie mogłam wykryć żadnych problemów.

Inną kluczową kwestią było to, że wszystko to nie zadziała, jeśli moja aplikacja, która konfiguruje program obsługi, ma 32-bitową. Gdy wpisy są wprowadzane w węźle Wow6432Node, nie byłem w stanie wybrać programu obsługi jako domyślnego dla danego protokołu. Zajęło mi to trochę czasu, ponieważ moja aplikacja została skompilowana jako AnyCPU. Co ja pierwszy brakowało ta mała flaga we właściwościach projektu:

enter image description here