I was considering developing a context menu shell extension following the new Windows 7+ approach based on IExecuteCommand
, as described in this blog post:
instead of the classic IContextMenu
approach I'm more familiar with.
I have a couple of questions about this new method:
How can I show localized text (for example, loaded from resources) in the customized menu items? In the old model, this can be simply done invoking InsertMenu
in the IContextMenu::QueryContextMenu
implementation, and passing a string loaded from resources.
How can I associate and show an icon with my custom menu items? Again, this can be done in the old IContextMenu
-based model, for example invoking SetMenuItemBitmaps
. Are there specific image formats required for the menu icons?
IExecuteCommand
is used for shell verbs that are registered statically in the Registry and have a "DelegateExecute"="{clsid}"
value associated with them. The menu text for a static verb is taken from the display text that is registered for the verb, and that text is displayed as-is, it cannot be localized, as there is simply no option provided to specify an alternate source for the text. Only a real shell extension based on .IContextMenu
or IExplorerCommand
has the option to localize text and provide icons for its custom verbs. IExecuteCommand
does not provide that functionality
UPDATE: On Windows XP and later, the display text for static verbs are MUI-aware, so you can provide display text that refers to a localized resource. This is documented:
Using Registry String Redirection
Provide Resources for Shell Verb Action Strings
Action strings for certain verbs, for example, "open" and "edit", are shown in the pop-up menu displayed when the user right-clicks a file in Windows Explorer. Your application does not have to specify strings for common shell verbs, as the shell has its own MUI-enabled defaults for these verbs. However, you should provide localizable string resources for strings representing uncommon verbs.
On pre-Windows XP operating systems, strings for shell verbs in the registry are rendered using the following syntax, where verb specifies the actual verb name:
HKCR\<progid>\shell\<verb> @ = <friendly-name>
Here's an example:
HKCR\Sample.app\shell\Disc @ = "Disconnect"
On Windows XP and later, you can use a level of indirection to make an action string depend on user interface language. These operating systems support a MUIVerb value for definition of a MUI-compatible string. Here's an example of a registry entry for an uncommon verb:
HKCR\Sample.app\shell\Disc @ = "Disconnect" "MUIVerb" = "@%systemroot%\system32\sample.exe,-9875"
Your MUI application should also be able to register the old default value as a localizable string, as shown below:
HKCR\Sample.app\shell\Disc @ = "@%systemroot%\system32\sample.exe,-9875"
Note Registration of the old default value is not recommended because it requires a different setup on Windows XP and later from the setup used on earlier operating systems.
AFAIK, you cannot provide an icon for a static verb to display in the context menu, though. You do need a shell extension based on IContextMenu
or IExplorerCommand
for that.