I did google couple of tutorials on google.
I am able to add right-click menu item to a FOLDER by doing this:
[HKEY_CLASSES_ROOT\\Di
See GitHub SingleInstanceAccumulator for a C# implementation of the well worn Mutex + COPYDATA approach to this.
other stack-o's expressing the need.
::creates the entry
:: and crucial multi-file handling property
reg add "HKEY_CLASSES_ROOT\FileType\shell\YourNewContextMenu" /f /v "MultiSelectModel" /d "Player"
::your desired command line
reg add "HKEY_CLASSES_ROOT\FileType\shell\YourNewContextMenu\command" /f /ve /t REG_EXPAND_SZ /d "***see command line examples***"
e.g. On my system, for ".mov" files, I would replace FileType
above with VLC.mov
Replace "* see command line examples *" above with your desired command line.
Note: quotes & environment variables must be escaped and escaping work slightly differently for the initial command versus later in the string!?!
λ reg add "HKEY_CLASSES_ROOT\VLC.mov\shell\Transcode\command" /f /ve /t REG_EXPAND_SZ /d "\"^%bin^%\SingleInstanceAccumulator\" -f \"-c:powershell -ExecutionPolicy bypass "\"^%bin^%\test.ps1\"" -list '$files'\" \"%1\""
"-c:command line" (default: cmd /c echo $files && pause)
$files will be replace with aggregated list
-f = output each item on separate line to new tempfile
$files will be replaced by the tempfile path
quote will default to nothing
-d:delimiter (default: ,)
-q:quote (default: ")
-t:timeout millisecs (default: 200)
-w = hidden launch
-v = debug output
note: initial command must have path for shell > command to work
note: -f usage
"%bin%\SingleInstanceAccumulator" -f "-c:powershell -ExecutionPolicy bypass "%bin%\test.ps1" -list '$files'" "%1"
note: -q usage
"%bin%\SingleInstanceAccumulator" -q:' "-c:powershell -ExecutionPolicy bypass "%bin%\test.ps1" -list $files" "%1"
powershell
param(
[String]$listFilePath
)
gc $listFilePath | % { $_ }
pause
erase $listFilePath
pause
param(
[String[]]$filesList
)
$filesList | % { $_ }
pause
The key word you're looking for is 'verbs' or 'handlers' not 'events'.
Context menu verbs for particular file extensions can be placed under the ProgID for the file type, the Perceived Type key (if the file type has a perceived type), the AllFileSystemObjects key, or the Base Class Key (*).
Note that writing to these keys in the HKEY_CLASSES_ROOT
hive will redirect the writes to HKEY_LOCAL_MACHINE\Software\Classes
, and will require elevated privileges. If you write to the HKEY_CURRENT_USER\Software\Classes
tree, you can do this with standard user rights.
It's up to you to handle a scenario where multiple files are selected. One instance of your application will be launched per file you have selected. You can solve this by checking if another instance of your application is running, and using Inter-Process Communication to notify the existing instance that other extensions have been selected.
On MSDN, be sure to read
You can do it with my program singleinstance. No shell extensions involved.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"
[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"
I'm not aware of any easy way to pass multiple items from a right-click context menu to one executable instance.