Как добавить новые элементы в событие щелчка правой кнопкой мыши на Папки и файлы в Windows? - PullRequest
8 голосов
/ 30 ноября 2009

Я сделал несколько обучающих программ по Google.

Я могу добавить пункт меню правой кнопкой мыши к ПАПКА , выполнив следующие действия:

[HKEY_CLASSES_ROOT\Directory\shell\Command]
@="TestRightClick:"

[HKEY_CLASSES_ROOT\Directory\shell\Command\Command]
@="myExecutable.exe %L"

Мне нужно добавить это и в ФАЙЛ.

1) Где я могу добавить его в реестр?

2) И как передать параметры в мой исполняемый файл, если я выбираю несколько файлов?

Связанный:

Как передать несколько путей к файлам / папкам с помощью события щелчка правой кнопкой мыши (глагол) в исполняемый файл?

Ответы [ 4 ]

9 голосов
/ 26 июля 2015

Вы можете сделать это с моей программой singleinstance . Расширения оболочки не включены.

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"
7 голосов
/ 01 декабря 2009

Ключевое слово, которое вы ищете, это «глаголы» или «обработчики», а не «события».

Глаголы контекстного меню для определенных расширений файлов можно поместить в ProgID для типа файла, ключа Perceived Type (если тип файла имеет предполагаемый тип), ключа AllFileSystemObjects или ключа базового класса (*).

Обратите внимание, что запись в эти ключи в кусте HKEY_CLASSES_ROOT перенаправит записи в HKEY_LOCAL_MACHINE\Software\Classes и потребует повышенных привилегий. Если вы пишете в дерево HKEY_CURRENT_USER\Software\Classes, вы можете сделать это со стандартными правами пользователя.

Вам решать сценарий, в котором выбрано несколько файлов. Один экземпляр вашего приложения будет запущен для каждого файла, который вы выбрали. Это можно решить, проверив, запущен ли другой экземпляр вашего приложения, и используя межпроцессное взаимодействие, чтобы уведомить существующий экземпляр о том, что были выбраны другие расширения.

На MSDN обязательно прочитайте

3 голосов
/ 01 декабря 2009
  1. Файлы имеют контекстное меню по расширению. Добавьте ключи реестра Command к соответствующему расширению или HKEY_CLASSES_ROOT \ *, чтобы повлиять на все файлы.
  2. Вы можете использовать% 1 для передачи имени файла приложению (так же, как вы указали% L выше). Если вы выберете несколько файлов, каждый из них будет вызываться отдельно, как если бы вы щелкали правой кнопкой мыши по каждому из них в отдельности.

Мне неизвестен простой способ передачи нескольких элементов из контекстного меню, вызываемого правой кнопкой мыши, в один исполняемый экземпляр.

0 голосов
/ 19 февраля 2018

См. GitHub 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

Примеры командной строки

примечание: исходная команда должна иметь путь , чтобы команда shell> работала

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...