title: Registering Custom URL Handler in C# on Windows 8
body: <pre><code>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 &amp;&amp;
              Environment.OSVersion.Version &gt;= _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);
          }
      }
  }
  </code></pre>
  
  <p>the above class was pieced together from snippets of code I found on the net, specifically:</p>
  
  <p><a href="http://dotnet-snippets.com/snippet/register-user-defined-url-protocol/2707" rel="nofollow noreferrer">http://dotnet-snippets.com/snippet/register-user-defined-url-protocol/2707</a> &lt;-- works for Win7 but not Win8</p>
  
  <p>which led me to find <a href="https://stackoverflow.com/questions/13559915/registering-a-protocol-handler-in-windows-8">Registering a protocol handler in Windows 8</a> which is an unconfirmed answer.</p>
  
  <p>HOWEVER, I can't get the URL protocol to work in Win8; clicking an <strong>aodb://1234</strong> 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.</p>
  
  <p>does <strong>anyone who has knowledge of protocol handlers</strong>, 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.</p>