using System; using System.Windows.Forms; using Microsoft.Win32; namespace Aodb { internal static class AodbProtocol { private const string _Protocol = "aodb"; private const string _ProtocolHandler = "url.aodb"; private static readonly string _launch = string.Format( "{0}{1}{0} {0}%1{0}", (char)34, Application.ExecutablePath); private static readonly Version _win8Version = new Version(6, 2, 9200, 0); private static readonly bool _isWin8 = Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version >= _win8Version; internal static void Register() { if (_isWin8) RegisterWin8(); else RegisterWin7(); } private static void RegisterWin7() { var regKey = Registry.ClassesRoot.CreateSubKey(_Protocol); regKey.SetValue(null, "URL:aodb Protocol"); regKey.SetValue("URL Protocol", ""); regKey = regKey.CreateSubKey(@"shell\open\command"); regKey.SetValue(null, _launch); } private static void RegisterWin8() { var regKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Classes") .CreateSubKey(_ProtocolHandler); regKey.SetValue(null, _Protocol); regKey.CreateSubKey("DefaultIcon") .SetValue(null, string.Format( "{0}{1},1{0}", "\"", Application.ExecutablePath)); regKey.CreateSubKey(@"shell\open\command").SetValue(null, _launch); Registry.LocalMachine.CreateSubKey(string.Format( @"SOFTWARE\{0}\{1}\Capabilities\ApplicationDescription\URLAssociations", Application.CompanyName, Application.ProductName)) .SetValue(_Protocol, _ProtocolHandler); Registry.LocalMachine.CreateSubKey(@"SOFTWARE\RegisteredApplications") .SetValue(Application.ProductName, string.Format( @"SOFTWARE\{0}\Capabilities", Application.ProductName)); } internal static void Unregister() { if (!_isWin8) { Registry.ClassesRoot.DeleteSubKeyTree("aodb", false); return; } // extra work required. Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Classes") .DeleteSubKeyTree(_ProtocolHandler, false); Registry.LocalMachine.DeleteSubKeyTree(string.Format(@"SOFTWARE\{0}\{1}", Application.CompanyName, Application.ProductName)); Registry.LocalMachine.CreateSubKey(@"SOFTWARE\RegisteredApplications") .DeleteValue(Application.ProductName); } } } the above class was pieced together from snippets of code I found on the net, specifically:
http://dotnet-snippets.com/snippet/register-user-defined-url-protocol/2707 <-- works for Win7 but not Win8
which led me to find Registering a protocol handler in Windows 8 which is an unconfirmed answer.
HOWEVER, I can't get the URL protocol to work in Win8; clicking an aodb://1234 hyperlink does not launch the application and the web browser complains that the protocol isn't supported, and I believe the above article is not a proper answer.
does anyone who has knowledge of protocol handlers, know where I went wrong in the above code and why the protocol doesn't register in win8? I can see the above code worked by looking at the registry keys in regedit, but for some reason, the protocol isn't recognized.
if (!_isWin8) return;, run your app, then restart your browser if it work.HKLM\SOFTWARE\MyApp\Capabilities\ApplicationDescription\URLAssociations myprotocol = MyApp.ProtocolHandler //Associated with your ProgIDRegistry.LocalMachine.CreateSubKey(string.Format( @"SOFTWARE\{0}\Capabilities\ApplicationDescription\URLAssociations", Application.ProductName)) .SetValue("aodb", string.Format(@"{0}.aodb", Application.ProductName));