172

How do I register a custom protocol with Windows so that when clicking a link in an email or on a web page my application is opened and the parameters from the URL are passed to it?

2

5 Answers 5

183
  1. Go to Start then in Find type regedit -> it should open Registry editor

  2. Click Right Mouse on HKEY_CLASSES_ROOT then New -> Key

enter image description here

  1. In the Key give the lowercase name by which you want urls to be called (in my case it will be testus://sdfsdfsdf) then Click Right Mouse on testus -> then New -> String Value and add URL Protocol without value.

enter image description here

  1. Then add more entries like you did with protocol ( Right Mouse New -> Key ) and create hierarchy like testus -> shell -> open -> command and inside command change (Default) to the path where .exe you want to launch is, if you want to pass parameters to your exe then wrap path to exe in "" and add "%1" to look like: "c:\testing\test.exe" "%1"

enter image description here

  1. To test if it works go to Internet Explorer (not Chrome or Firefox) and enter testus:have_you_seen_this_man this should fire your .exe (give you some prompts that you want to do this - say Yes) and pass into args testus://have_you_seen_this_man.

Here's sample console app to test:

using System; namespace Testing { class Program { static void Main(string[] args) { if (args!= null && args.Length > 0) Console.WriteLine(args[0]); Console.ReadKey(); } } } 

Hope this saves you some time.

Sign up to request clarification or add additional context in comments.

16 Comments

Wow this thing works. And not only on IE but also on Chrome!
Any way to do this in C#? Like an installer...?
@MatasVaitkevicius can I specify "working directory for the application to run from" in registry(within custom URL protocol entry). Ex. for triggering a Batch file if I create a custom Url registry entry, the batch file runs from system32 when launched from browser irrespective of the location of the batch file, whereas if I run the batch file by double clicking it, then the working directory remains its current directory.
@MatasVaitkevicius Thanks. yeah found the answer. posting here-may be usefull for someone else. stackoverflow.com/questions/68577785/…
|
26

[Obsolete - the MSDN information has been replaced by a new page which does address the security concerns]

The MSDN link is nice, but the security information there isn't complete. The handler registration should contain "%1", not %1. This is a security measure, because some URL sources incorrectly decode %20 before invoking your custom protocol handler.

PS. You'll get the entire URL, not just the URL parameters. But the URL might be subject to some mistreatment, besides the already mentioned %20->space conversion. It helps to be conservative in your URL syntax design. Don't throw in random // or you'll get into the mess that file:// is.

7 Comments

What do you exactly mean by "mess that the file://" is?
There's no formal mapping of file: URLs to local paths. There's not even a consensus on the use of two or three leading slashes, or the use of forward versus backward slashes when the path refers to a Windows directory.
Late comment, I know. But is it also possible to somehow access the URL parameters only, without the protocol handler?
That sounds like a separate question. Please do get your terms straight, though. The protocol handler is the program that receives the URL. "Without the protocol handler" there's nobody to parse the URL and access the URL parameters.
@WiiLF: Correct, the registry treats it as just a REG_SZ. And internally, Windows doesn't parse command lines so spaces are preserved as well. But any language runtime that parses a command line (such as C's argv[]parsing) will break on an unquoted space.
|
26

If anyone wants a .reg file for creating the association, see below:

Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\duck] "URL Protocol"="" [HKEY_CLASSES_ROOT\duck\shell] [HKEY_CLASSES_ROOT\duck\shell\open] [HKEY_CLASSES_ROOT\duck\shell\open\command] @="\"C:\\Users\\duck\\source\\repos\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\net6.0\\ConsoleApp1.exe\" \"%1\"" 

Paste that into notepad, then file -> save as -> duck.reg, and then run it. After running it, when you type duck://arg-here into chrome, ConsoleApp1.exe will run with "arg-here" as an argument. Double slashes are required for the path to the exe and double quotes must be escaped.

Tested and working on Windows 11 with Edge (the chrome version) and Chrome

2 Comments

what happens if the registration already exists? does this reg override it?
@NitinSawant Yes, if it already exists it will override it.
8

There is an npm module for this purpose.

link :https://www.npmjs.com/package/protocol-registry

So to do this in nodejs you just need to run the code below:

First Install it

npm i protocol-registry 

Then use the code below to register you entry file.

const path = require('path'); const ProtocolRegistry = require('protocol-registry'); console.log('Registering...'); // Registers the Protocol ProtocolRegistry.register({ protocol: 'testproto', // sets protocol for your command , testproto://** command: `node ${path.join(__dirname, './index.js')} $_URL_`, // $_URL_ will the replaces by the url used to initiate it override: true, // Use this with caution as it will destroy all previous Registrations on this protocol terminal: true, // Use this to run your command inside a terminal script: false }).then(async () => { console.log('Successfully registered'); }); 

Then suppose someone opens testproto://test then a new terminal will be launched executing :

node yourapp/index.js testproto://test 

It also supports all other operating system.

2 Comments

Is there a cross-platform tool like this available as a C++ library?
Hi there is a cli version of this available as "protocol-registry-cli" You can use it and run it through c++
3

To further the existing answers a bit more, the application invoked to handle the protocol does not have to be a compiled application. It can also be a script file.

For example, you could create a Windows batch file - such as that below to - handle the call. Let us assume you save that script to c:\temp\testprotocol-handler.bat.

REM just echo the passed argument echo off echo Hello from the custom protocol handling script. echo script name: %0 echo script arg : %1 pause 

Use the following registry configuration to map the script to the protocol testprotocol.

Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\testprotocol] "URL Protocol"="" [HKEY_CLASSES_ROOT\testprotocol\shell] [HKEY_CLASSES_ROOT\testprotocol\shell\open] [HKEY_CLASSES_ROOT\testprotocol\shell\open\command] @="\"C:\\temp\\testprotocol-handler.bat\" \"%1\"" 

When the OS encounters the protocol it will execute the script - opening a command window and displaying the content of the echo statements in the script.

sample script executing

3 Comments

Reminder to put double-backslash for each path separator in the .REG script.
God bless you, this specific scenario was very relevant to me :)
Great for a script, I think I may want to propose a powershell method for this.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.