Название: [РЕШЕНО] Контекстное меню Отправлено: OKTA от Июль 25, 2014, 17:04 Вопрос простой. Хочу добавить в контекстное меню (что по щелчке правой кнопкой на папке или файле) свою программу. Сделал - работает. Но вот проблема, если выделить несколько файлов - папок, то программа запускается для каждого выделенного объекта... Вопрос как раз в этом, как через контекстное меню получить список всех выделенных объектов???
Название: Re: Контекстное меню Отправлено: gil9red от Июль 25, 2014, 18:21 Не по теме: А как сделали для одного файла? :)
Название: Re: Контекстное меню Отправлено: Bepec от Июль 25, 2014, 21:28 Эммм.. По идее если выделяется группа, то передаются имена файлов через разделитель как бы... Ну должно так быть... ммм... сча проверю :D
Название: Re: Контекстное меню Отправлено: kambala от Июль 25, 2014, 21:34 Не по теме: А как сделали для одного файла? :) в винде в реестр надо несколько ключей вписать, посмотри в MSDNНазвание: Re: Контекстное меню Отправлено: Bepec от Июль 25, 2014, 21:40 Точнее добавить можно аж несколькими способами. Для файлов, для рабочего стола, для всех, для пользователя... Вы как добавили? :)
Кстати да, на каждый файл открывает свою копию. На моей компе другие программы для пакетной работы используют dll'ку комовскую, как я понимаю. Цитировать Если вас интересует программная реализация, то это делается путем написания расширения для проводника. Имплементация COM интерфейса IContextMenu и прочее. Вот статья www.rsdn.ru/article/winshell/shlext7.xml https://toster.ru/q/16546 © Именно так делают WinRAR и 7zip. Есть и другие методики, но они тоже связаны с COM. Если же вам интересует готовое решение, то есть программы, позволяющие это сделать, например www.freewebs.com/dengdun/en/openxx.htm Там можно в настройках добавить вашу команду, и выбрать Associate With: Multiple Files. Собственно беглый осмотр в течении 10 минут показал - это ограничение безопасности Windows. На каждый самописный пункт использованный на группе ( не COM расширение) создаётся энное количество разрешений/запросов на использование. Соответственно запускается N отдельных экземпляров. Это доблестный UAC реагирует на "опасность". И да, права передаются только разрешённой копии программе. Т.е. запустив программу которая тупо передаёт имя файла в основную, то основная потом скажет кряк - не могу сохранить, нет доступа :D PS так что писать вам расширение ^^ Название: Re: Контекстное меню Отправлено: gil9red от Июль 25, 2014, 22:42 Я так понимаю, что при клике на контекстное меню с выделенными файлами/папками произойдет запуск вашей программы с переданной ей в аргументе пути к файлу/папке?
Может вам попробовать QtSingleApplication? Если при открытии прога обнаружит, что является копией, отошлет путь к файлу/папке оригиналу и закроется. Оригинал же сам разберется что делать с файлом/папкой Вот в этой проге (https://github.com/gil9red/NotesManager/blob/master/main.cpp) я использовал QtSingleApplication, и если при проверке оказывалось, что была запущена копия, то она об этом говорила оригиналу и убивалась. Название: Re: Контекстное меню Отправлено: Bepec от Июль 25, 2014, 22:57 Собственно как написано выше - это не спасёт при включенном UAC. Будет выдано N запросов UAC на N файлов :D
Название: Re: Контекстное меню Отправлено: OKTA от Июль 28, 2014, 10:34 Спасибо, товарищи, за советы)
Я решил делать так, что будет приложение стартовое, которое может быть запущено только одно и каждая новая запущенная копия будет писать свои данные (в нашем случае - путь к папке-фалу) в общую память. Соответственно самое первое запущенное приложение будет главным и какое-то время ждать (совсем чуть-чуть - 200 миллисекунд думаю должно хватить), что могут придти данные от копий. По таймауту запускается основное приложение, куда передаются все данные, а стартовое приложение завершается. Думаю, это будет проще и универсальнее, чем погружаться в дремучести всяких COM) О, QtSingleApplication! Спасибо!! :o "о сколько нам открытий чудных..." ;D Название: Re: Контекстное меню Отправлено: OKTA от Июль 28, 2014, 15:13 Шайтан.. видать все же придется лезть в эти пучины COM.. Просто так не сделаешь единое меню при одновременном выборе и папок и файлов >:(
а все так хорошо начиналось! ;D Название: Re: Контекстное меню Отправлено: Bepec от Июль 28, 2014, 15:43 Почему не сделаешь? идентификатор * не подходит?
Название: Re: Контекстное меню Отправлено: OKTA от Июль 28, 2014, 16:16 А куда предлагаешь его всунуть?))
Косяк в том, что для файлов и для папок в реестре отдельные ветки с содержимым контекстного меню, а какой-нибудь общей я не нашел)) Название: Re: Контекстное меню Отправлено: Bepec от Июль 28, 2014, 17:15 Хм. посмотрю. Просто когда я пытался, я всобачил свою программу в какую то ветку и этот пункт у меня был везде вообще.
Да, всё решается просто - если пункт находится в "*" и в "directory", то при групповой работе он появляется. Имеется мысль что сработает если будет совпадение расширение файлов + директория. Название: Re: Контекстное меню Отправлено: ioann.sys от Июль 28, 2014, 17:42 А если при запуске проги, сразу же выполнять проверку на наличие запущенной копии?
Название: Re: Контекстное меню Отправлено: Bepec от Июль 28, 2014, 19:06 Если почитать - то эту проблему уже решил ТС :D
Правда на UAC'е его не проверял по видимому :) Название: Re: Контекстное меню Отправлено: OKTA от Июль 29, 2014, 09:25 Можно сказать, что проблема частично решена за счет стартового приложения с QtSingleApplication, которое собирает пути ко всем выделенным папкам-файлам и потом запускает основное приложение, но осталась проблема с самим выбором этих папок-файлов. Работает крайне странно - например, выбираешь 10 папок - все ок - пункт в меню есть, выбираешь больше - все, пункт исчезает)
Если интересно, для папок прописываю команду вот здесь HKEY_CLASSES_ROOT\Directory\shell А для файлов - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell |