2014-12-02 17 views
5

Ho un small project to handle tel: protocol links. È un'applicazione desktop, che sto sviluppando utilizzando Visual Studio 2013 Community Edition.Come registrare correttamente un gestore di protocollo su Windows 8?

In precedenza, ho usato per registrare il gestore con una semplice modifica del Registro:

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

Tuttavia, questo non sembra più funzionare su Windows 8. Mentre la chiave di registro ha il valore desiderato, i collegamenti sono ancora gestito da un'altra applicazione. Il mio strumento non compare nemmeno nella selezione gestore di protocollo:

enter image description here

Ho guardato Walkthrough: Using Windows 8 Custom Protocol Activation, ma non può riguardare le informazioni di cui alla mia domanda. L'articolo cita un file .appxmanifest, che non ho nel mio progetto e non riesco ad aggiungere come nuovo elemento.

+0

è la vostra applicazione un Application Store di Windows o un'applicazione desktop? Quale versione di Visual Studio stai usando? | Con quale parte dell'articolo collegato hai avuto problemi? Si dovrebbe essere in grado di aggiungere 'tel:' nell'elenco dei protocolli delle impostazioni del progetto, e quindi dovrebbe apparire nell'elenco in cui l'utente può scegliere un gestore di protocollo. – CodesInChaos

+0

@CodesInChaos: è un'applicazione desktop. Sto usando VS2013 Community Edition. L'articolo si riferisce a un file manifest che non ho nel mio progetto e che non riesco ad aggiungere. L'articolo si riferisce esplicitamente a quel manifest, che non ho. –

risposta

8

Dopo aver chiesto la questione, sono incappato in Registering a protocol handler in Windows 8

La parte superiore ha votato risposta non mi ha fatto sulla strada giusta, anche se c'erano altre questioni. Alla fine, questo è quello che ho finito con:

// 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 è il nome della mia applicazione e deve essere sostituito da qualunque sia il nome del gestore è.

La risposta accettata nell'altra domanda ha anche ApplicationDescription nel registro. Non ho visto la stessa chiave per nessuno degli altri handler registrati che ho controllato, quindi l'ho lasciato fuori e non ho rilevato alcun problema.

Un altro problema chiave era che tutto questo non funzionava se la mia applicazione che impostava il gestore era a 32 bit. Quando le voci sono fatte nel Wow6432Node, non ero in grado di selezionare il gestore come predefinito per il protocollo specificato. Mi ci è voluto un po 'per capirlo, perché la mia applicazione è stata compilata come AnyCPU. Quello che prima mancava era questa piccola bandiera nelle proprietà del progetto:

enter image description here

Problemi correlati