How to add new items to right-click event on Folders and Files in Windows?

后端 未结 4 2033
一个人的身影
一个人的身影 2020-12-03 04:14

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         


        
相关标签:
4条回答
  • 2020-12-03 04:37

    See GitHub SingleInstanceAccumulator for a C# implementation of the well worn Mutex + COPYDATA approach to this.

    other stack-o's expressing the need.

    Explorer Context Menu config

    ::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

    Complex REG ADD example

    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\""
    

    SingleInstanceAccumulator.exe Usage

    "-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
    

    Command Line Examples

    note: initial command must have path for shell > command to work

    PowerShell & temp file

    note: -f usage

    "%bin%\SingleInstanceAccumulator" -f "-c:powershell -ExecutionPolicy bypass "%bin%\test.ps1" -list '$files'" "%1"
    

    PowerShell & inline files list

    note: -q usage

    "%bin%\SingleInstanceAccumulator" -q:' "-c:powershell -ExecutionPolicy bypass "%bin%\test.ps1" -list $files" "%1"
    

    test.ps1 (with temp file)

    powershell
    param(
      [String]$listFilePath
    )
    
    gc $listFilePath | % { $_ }
    
    pause
    
    erase $listFilePath
    
    pause
    

    test.ps1 (with files array parm)

    param(
      [String[]]$filesList
    )
    
    $filesList | % { $_ }
    
    pause
    
    0 讨论(0)
  • 2020-12-03 04:39

    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

    • Overview of Verbs and File Associations
    • Creating Context Menu Handlers
    0 讨论(0)
  • 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"
    
    0 讨论(0)
  • 2020-12-03 04:48
    1. Files have context menus by extension. Add your Command registry keys to the appropriate extension or HKEY_CLASSES_ROOT\* to affect all files.
    2. You can use %1 to pass the filename to the application (much like you've indicated with %L above). If you select multiple files, each will be called separately, as if you right-clicked each one individually.

    I'm not aware of any easy way to pass multiple items from a right-click context menu to one executable instance.

    0 讨论(0)
提交回复
热议问题