Russian Qt Forum
Май 04, 2024, 16:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Контекстное меню  (Прочитано 8818 раз)
OKTA
Гость
« : Июль 25, 2014, 17:04 »

Вопрос простой. Хочу добавить в контекстное меню (что по щелчке правой кнопкой на папке или файле) свою программу. Сделал - работает. Но вот проблема, если выделить несколько файлов - папок, то программа запускается для каждого выделенного объекта... Вопрос как раз в этом, как через контекстное меню получить список всех выделенных объектов???
« Последнее редактирование: Сентябрь 10, 2014, 15:18 от OKTA » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 25, 2014, 18:21 »

Не по теме: А как сделали для одного файла? Улыбающийся
Записан

Bepec
Гость
« Ответ #2 : Июль 25, 2014, 21:28 »

Эммм.. По идее если выделяется группа, то передаются имена файлов через разделитель как бы... Ну должно так быть... ммм... сча проверю Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Июль 25, 2014, 21:34 »

Не по теме: А как сделали для одного файла? Улыбающийся
в винде в реестр надо несколько ключей вписать, посмотри в MSDN
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #4 : Июль 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 реагирует на "опасность". И да, права передаются только разрешённой копии программе. Т.е. запустив программу которая тупо передаёт имя файла в основную, то основная потом скажет кряк - не могу сохранить, нет доступа Веселый

PS так что писать вам расширение ^^
« Последнее редактирование: Июль 25, 2014, 22:02 от Bepec » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Июль 25, 2014, 22:42 »

Я так понимаю, что при клике на контекстное меню с выделенными файлами/папками произойдет запуск вашей программы с переданной ей в аргументе пути к файлу/папке?
Может вам попробовать QtSingleApplication? Если при открытии прога обнаружит, что является копией, отошлет путь к файлу/папке оригиналу и закроется. Оригинал же сам разберется что делать с файлом/папкой

Вот в этой проге я использовал QtSingleApplication, и если при проверке оказывалось, что была запущена копия, то она об этом говорила оригиналу и убивалась.
« Последнее редактирование: Июль 25, 2014, 22:46 от gil9red » Записан

Bepec
Гость
« Ответ #6 : Июль 25, 2014, 22:57 »

Собственно как написано выше - это не спасёт при включенном UAC. Будет выдано N запросов UAC на N файлов Веселый
Записан
OKTA
Гость
« Ответ #7 : Июль 28, 2014, 10:34 »

Спасибо, товарищи, за советы)
Я решил делать так, что будет приложение стартовое, которое может быть запущено только одно и каждая новая запущенная копия будет писать свои данные (в нашем случае - путь к папке-фалу) в общую память. Соответственно самое первое запущенное приложение будет главным и какое-то время ждать (совсем чуть-чуть - 200 миллисекунд думаю должно хватить), что могут придти данные от копий. По таймауту запускается основное приложение, куда передаются все данные, а стартовое приложение завершается.

Думаю, это будет проще и универсальнее, чем погружаться в дремучести всяких COM)

О, QtSingleApplication! Спасибо!!   Шокированный "о сколько нам открытий чудных..."  Смеющийся
Записан
OKTA
Гость
« Ответ #8 : Июль 28, 2014, 15:13 »

Шайтан.. видать все же придется лезть в эти пучины COM.. Просто так не сделаешь единое меню при одновременном выборе и папок и файлов  Злой
 а все так хорошо начиналось!  Смеющийся
Записан
Bepec
Гость
« Ответ #9 : Июль 28, 2014, 15:43 »

Почему не сделаешь? идентификатор * не подходит?
Записан
OKTA
Гость
« Ответ #10 : Июль 28, 2014, 16:16 »

А куда предлагаешь его всунуть?))

Косяк в том, что для файлов и для папок в реестре отдельные ветки с содержимым контекстного меню, а какой-нибудь общей я не нашел))
Записан
Bepec
Гость
« Ответ #11 : Июль 28, 2014, 17:15 »

Хм. посмотрю. Просто когда я пытался, я всобачил свою программу в какую то ветку и этот пункт у меня был везде вообще.

Да, всё решается просто - если пункт находится в "*" и в "directory", то при групповой работе он появляется.

Имеется мысль что сработает если будет совпадение расширение файлов + директория.
« Последнее редактирование: Июль 28, 2014, 17:30 от Bepec » Записан
ioann.sys
Гость
« Ответ #12 : Июль 28, 2014, 17:42 »

А если при запуске проги, сразу же выполнять проверку на наличие запущенной копии?
Записан
Bepec
Гость
« Ответ #13 : Июль 28, 2014, 19:06 »

Если почитать - то эту проблему уже решил ТС Веселый

Правда на UAC'е его не проверял по видимому Улыбающийся
Записан
OKTA
Гость
« Ответ #14 : Июль 29, 2014, 09:25 »

Можно сказать, что проблема частично решена за счет стартового приложения с QtSingleApplication, которое собирает пути ко всем выделенным папкам-файлам и потом запускает основное приложение, но осталась проблема с самим выбором этих папок-файлов. Работает крайне странно - например, выбираешь 10 папок - все ок - пункт в меню есть, выбираешь больше - все, пункт исчезает)
Если интересно, для папок прописываю команду вот здесь HKEY_CLASSES_ROOT\Directory\shell
А для файлов - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.