Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: OKTA от Июль 25, 2014, 17:04



Название: [РЕШЕНО] Контекстное меню
Отправлено: 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
Именно так делают WinRAR и 7zip. Есть и другие методики, но они тоже связаны с COM.

Если же вам интересует готовое решение, то есть программы, позволяющие это сделать, например
www.freewebs.com/dengdun/en/openxx.htm
Там можно в настройках добавить вашу команду, и выбрать Associate With: Multiple Files.
https://toster.ru/q/16546 ©

Собственно беглый осмотр в течении 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