For several programs, I've wanted to be able to add a shell context menu item for a file that runs an exe. After some research, I came up with the following information. This menu is controlled by certain registry entries under the HKCR (Classes Root) entry. In HKCR, there are two relevant entries for each file extension: the actual extension, and the handler for that extension. For .bmp, for example, the extension key is as follows:

The key part of the extension key is the default string value that points to the handler for this extension, in this case Paint.Picture. Here's the handler:

To add a new context menu item, simply add a new key to the shell subkey of the handler key. Name it whatever you want. The default string value for the key will be the caption of the menu item. To specify the command to run, add a command subkey to your menu item key. The default string value of this key should be the path to your application. You can append "%1" to pass the filename of the file to your app.

I've written a registry helper class that encapsulates all of this, allowing you to create a handler with just one line of code. You can call it as follows:

RegistryHelper.RegisterHandler(".ext","commandname","caption",true);

Where:

  • ".ext" is the extension you want to add a context menu to
  • "commandname" is the name of the command
  • "caption" is the caption to display in the context menu
  • the boolean in the last parameter determines whether to create a system-wide context menu extension, or to register it for just the current user

This overload will determine what the path is to the currently running assembly, or you can use one of the other overloads that allows you to specify the path.

RegistryHelper.cs

Comments

Comment by md

Can you provide please a simple how to add a root menu and SubMenus for it?

md
Comment by Gerardo Gala

This code worked perfectly on XP. I couldn't get it to work on Vista (Home).

Anything I'm missing?

Thanks!

Comment by Chris Hynes

Do you have UAC on? If so, try running the code as admin -- with UAC on, Vista virtualizes some protected registry writes instead of allowing apps to write to the actual location.