Как добавить новые элементы в событие щелчка правой кнопкой мыши на Папки и файлы в Windows?
Я сделал несколько обучающих программ по Google.
Я могу добавить пункт меню, щелкнув правой кнопкой мыши на ПАПКУ, выполнив следующие действия:
[HKEY_CLASSES_ROOT\Directory\shell\Command]
@="TestRightClick:"
[HKEY_CLASSES_ROOT\Directory\shell\Command\Command]
@="myExecutable.exe %L"
Мне нужно добавить это в файл также.
1) Где я могу добавить его в реестр?
2) И как мне передать параметры в мой исполняемый файл, если я выбираю несколько файлов?
Связанные с:
4 ответа
- Файлы имеют контекстное меню по расширению. Добавьте ключи реестра Command к соответствующему расширению или HKEY_CLASSES_ROOT\*, чтобы повлиять на все файлы.
- Вы можете использовать%1, чтобы передать имя файла приложению (так же, как вы указали%L выше). Если вы выберете несколько файлов, каждый из них будет вызван отдельно, как если бы вы щелкнули правой кнопкой мыши по каждому из них в отдельности.
Я не знаю ни одного простого способа передать несколько элементов из контекстного меню, вызываемого правой кнопкой мыши, в один исполняемый экземпляр.
Вы можете сделать это с помощью моей единственной программы. Расширения оболочки не включены.
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"
Ключевое слово, которое вы ищете, это "глаголы" или "обработчики", а не "события".
Глаголы контекстного меню для определенных расширений файлов могут быть помещены в ProgID для типа файла, ключа Perceived Type (если тип файла имеет предполагаемый тип), ключа AllFileSystemObjects или ключа базового класса (*).
Обратите внимание, что запись на эти ключи в HKEY_CLASSES_ROOT
улей перенаправит записи в HKEY_LOCAL_MACHINE\Software\Classes
и потребует повышенных привилегий. Если вы напишите в HKEY_CURRENT_USER\Software\Classes
дерево, вы можете сделать это со стандартными правами пользователя.
Вам решать сценарий, в котором выбрано несколько файлов. Один экземпляр вашего приложения будет запущен для каждого файла, который вы выбрали. Вы можете решить эту проблему, проверив, запущен ли другой экземпляр вашего приложения, и используя межпроцессное взаимодействие, чтобы уведомить существующий экземпляр о том, что были выбраны другие расширения.
На MSDN обязательно прочитайте
См. https://github.com/Beej126/SingleInstanceAccumulator для реализации C# хорошо носимого подхода Mutex + COPYDATA к этому.
другие стэки о выражают потребность.
Конфигурация контекстного меню проводника
::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***"
Например, в моей системе для файлов ".mov" я бы заменил FileType
выше с VLC.mov
Комплексный пример REG ADD
Замените "* см. Примеры командной строки *" выше на желаемую командную строку.
Примечание: кавычки и переменные окружения должны быть экранированы и экранировать работу немного по-другому для начальной команды по сравнению с более поздней строкой!?!
λ 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
"-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
Примеры командной строки
примечание: исходная команда должна иметь путь для работы оболочки> команда
PowerShell и временный файл
примечание: -f использование
"%bin%\SingleInstanceAccumulator" -f "-c:powershell -ExecutionPolicy bypass "%bin%\test.ps1" -list '$files'" "%1"
PowerShell и встроенный список файлов
примечание: -q использование
"%bin%\SingleInstanceAccumulator" -q:' "-c:powershell -ExecutionPolicy bypass "%bin%\test.ps1" -list $files" "%1"
test.ps1 (с временным файлом)
powershell
param(
[String]$listFilePath
)
gc $listFilePath | % { $_ }
pause
erase $listFilePath
pause
test.ps1 (с массивом файлов parm)
param(
[String[]]$filesList
)
$filesList | % { $_ }
pause