Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Delphi: Система, Windows API > Открытие файлов из проводника |
Автор: PIKACHU 23.04.09, 15:23 |
Выделяем НЕСКОЛЬКО файлов в проводнике, зарегистрированых за моей прогой, нажимаем Enter и почему то передается только выделеный файл, как передать все файлы моей программе ПС спосибо за уделенное время |
Автор: Rouse_ 23.04.09, 17:00 |
Регистрировать свое расширение оболочки реализующее интерфейс IShellExtInit и в IShellExtInit.Initialize брать все выделенные элементы и передавать своей программе. |
Автор: PIKACHU 23.04.09, 17:41 |
А через парамстр ни как? Я боюсь ета ерунда систему тормозить будет. |
Автор: Domino 23.04.09, 18:28 |
Винда производит последовательные вызовы <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> YourProgram.exe C:\File1.ext <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> YourProgram.exe C:\File2.ext <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> научите программу работать только в одном экземпляре, а вторую копию — передавать параметр запуска первой перед закрытием. Так проще? YourProgram.exe C:\File3.ext ![]() |
Автор: andrew.virus 24.04.09, 01:30 |
PIKACHU для запрета запуска второй копии программы посмотри эту тему ... передавать данные между экземплярами можно, например, используя сообщение WM_COPYDATA ... |
Автор: andrew.virus 24.04.09, 11:08 |
PIKACHU пример, который выполняет требуемое тебе в прилагаемом архиве ... он открывает в одном приложении несколько файлов (новая копия отсылает параметр и закрывается) ... надеюсь поможет ... ![]() |
Автор: PIKACHU 24.04.09, 11:43 |
Класно, то что надо), только есть одно но, в папке не роется( |
Автор: andrew.virus 24.04.09, 20:31 |
а зачем рыться? можно вызывать файлы простым анализом выделенной группы файлом из проводника ... а если нужно как ты говоришь "рыться в папке", то перебирай их, например, методами описанными в этой статье ... |
Автор: PIKACHU 25.04.09, 06:11 |
В том то и дело что при отрытии группы файлов, зарегеные файлы открываются как надо, а папка открывается в эксплоере, мож надо как то регить папку? |
Автор: andrew.virus 25.04.09, 23:10 |
Цитата PIKACHU @ В том то и дело что при отрытии группы файлов, зарегеные файлы открываются как надо, а папка открывается в эксплоере, мож надо как то регить папку? написанно не совсем понятно - попробую потелепатить немного, если проравильно понял, то нужно такое ... при выборе из программы папки на открытие программа перебирает все файлы зарегистрированного типа в ней и открывает их ... для реализации этого можно использовать такой код: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> var fs: TSearchRec; begin result:=0; if findfirst(Dir+'\*.xxx', faAnyFile - faDirectory - faVolumeID, fs) = 0 then repeat inc(result); NewTabData(Dir + '\' + fs.name) until findnext(fs) <> 0; findclose(fs) end; з.ы.: полный код примера в прилагаемом архиве .... |
Автор: PIKACHU 26.04.09, 06:12 |
Не то, поиск я знаю как сделать, например(смотреть в картинку), файлы типа xxx открываются в программе а папка test folder открывается в эксплоеере надо чтоб эксплоер передовал путь папки. |
Автор: andrew.virus 26.04.09, 20:43 |
Цитата PIKACHU @ Не то, поиск я знаю как сделать, например(смотреть в картинку), файлы типа xxx открываются в программе а папка test folder открывается в эксплоеере надо чтоб эксплоер передовал путь папки. такой реакции для папок можно добиться если зарегистрировать для меню "Открыть с помощью ..." твое приложение (раздел, если не ошибаюсь [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.directory\OpenWithList]) ... но если просто бросать файлы на форму приложения и обрабатывать их то посмотри материалы этой темы ... еще один вариант решения задачи это регистрация для папок пункта меню "Открыть в MyProject" для контекстного меню ... Цитата создать команду, применимую к любой папке, диску и т.п. В разделе HKEY_CLASSES_ROOT\Folder\shell создайте новый раздел, назвав его своим именем (например "Огого"). В параметре "По умолчанию" задайте имя команды (например "Команда Огого"). Создайте раздел Command в разделе "Огого" и запишите свою команду. |
Автор: PIKACHU 27.04.09, 04:20 |
что то меня смущает HKEY_CURRENT_USER, а в HKEY_LOCAL_MACHINE нельзя? ПС Еще не проверял, на работе нет Delphi |
Автор: PIKACHU 29.04.09, 10:13 |
Не получается, та же реакция |
Автор: andrew.virus 29.04.09, 21:16 |
что именно не получается - добавить действие для конкретного типа файлов (папок) или бросать файлы на форму и обрабатывать их .... можно сделать также переписав функции ассоциирования приложения с файлами и обработчик OnCreate таким образом ... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> procedure TForm1.FormCreate(Sender: TObject); begin RestoreOldInstance:=RegisterWindowMessage('{FC9D27F6-D173-4CF6-8A9A-3A2197C72390}'); Application.HookMainWindow(ApplicationMessage); if paramcount > 0 then if directoryexists(paramstr(1)) then OpenFilesFromFolder(paramstr(1)) else NewTabData(paramstr(1)) end; procedure TForm1.RegButtonClick(Sender: TObject); var reg: TRegistry; begin reg:=TRegistry.Create; // регистрация ассоциирования файлов с данной программой .... reg.RootKey:=HKEY_CLASSES_ROOT; reg.LazyWrite:=false; reg.OpenKey('.xxx\shell\open\command', true); // имя файла будет передавать в приложение как первый параметр reg.WriteString('', Application.ExeName + ' %1'); // добавляем отображаемую иконку reg.CloseKey; reg.OpenKey('.xxx\DefaultIcon',true); // для отображения используем первую иконку в нашем приложении reg.WriteString('', Application.ExeName + ',0'); // добвление пункта меню для папки с целью обработки её моей программой .... reg.CloseKey; reg.OpenKey('Directory\shell\Открыть в "ХХХ Explorer" ...\command', true); // имя папки будет передаваться в приложение как первый параметр reg.WriteString('', Application.ExeName + ' %1'); reg.CloseKey; reg.free end; procedure TForm1.UnRegButtonClick(Sender: TObject); var reg: TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_CLASSES_ROOT; reg.LazyWrite:=false; reg.DeleteKey('.xxx'); reg.DeleteKey('Directory\shell\Открыть в "ХХХ Explorer" ...'); reg.free end; з.ы.: в архиве изменненный вариант примера решения ... |
Автор: PIKACHU 30.04.09, 02:23 |
Извеняюсь но не то, это я уже понел как делать, какроче Winamp так может, при выдилении файлов и папок winampу как то передаются все файлы и папки, а у меня файлы передаются, а папки открываются просто в эксплоере, а мне надо еще передать путь папки своей программе. ПС: Надеюсь теперь понятно) |
Автор: PIKACHU 30.04.09, 16:03 |
Все еще жду ответа( ПС: Бедный мой реестр) |
Автор: andrew.virus 30.04.09, 21:35 |
Цитата PIKACHU @ Извеняюсь но не то, это я уже понел как делать, какроче Winamp так может, при выдилении файлов и папок winampу как то передаются все файлы и папки, а у меня файлы передаются, а папки открываются просто в эксплоере, а мне надо еще передать путь папки своей программе. для решения этой проблемы просто нужно добавить команду "Открыть в "XXX Explorer" ..." и для ассоциированных файлов и пользоваться ей ... помнится Winamp добавляет пункт "Открыть в Winamp ..." ... код меняется только для процедур регистрации и открытия переданного параметра и будет таким .... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> procedure TForm1.WMCopyData(var Msg: TWMCopyData); var str_tmp: string; begin if (Msg.CopyDataStruct^).lpData = nil then str_tmp:=''; setLength(str_tmp, Msg.CopyDataStruct^.cbData); str_tmp:=pChar((Msg.CopyDataStruct^).lpData); if (extractfileext(str_tmp) = '.xxx') and fileexists(str_tmp) then NewTabData(str_tmp) else if directoryexists(str_tmp) then OpenFilesFromFolder(str_tmp) end; procedure TForm1.RegButtonClick(Sender: TObject); var reg: TRegistry; begin reg:=TRegistry.Create; // регистрация ассоциирования файлов с данной программой .... reg.RootKey:=HKEY_CLASSES_ROOT; reg.LazyWrite:=false; reg.OpenKey('.xxx\shell\open\command', true); // имя файла будет передавать в приложение как первый параметр reg.WriteString('', Application.ExeName + ' %1'); reg.CloseKey; reg.OpenKey('.xxx\shell\Открыть в "ХХХ Explorer"\command', true); // имя папки будет передаваться в приложение как первый параметр reg.WriteString('', Application.ExeName + ' %1'); reg.CloseKey; // добавляем отображаемую иконку reg.OpenKey('.xxx\DefaultIcon',true); // для отображения используем первую иконку в нашем приложении reg.WriteString('', Application.ExeName + ',0'); reg.CloseKey; // добвление пункта меню для папки с целью обработки её моей программой .... reg.OpenKey('Directory\shell\Открыть в "ХХХ Explorer"\command', true); // имя папки будет передаваться в приложение как первый параметр reg.WriteString('', Application.ExeName + ' %1'); reg.CloseKey; reg.free end; з.ы.: в прилагаемом архиве пример с последними изменениями ... |
Автор: PIKACHU 01.05.09, 07:52 |
Не понели вы меня), это отдельный случай, его я уже давно сделал. При выделении файлов .ххх, только файлов, все работает. А если в эту группу выделеных файлов выделить и папку, то пути файлов передаются в программу открываются, а папка нет. Передача файлов и папок доложна передаватся за одно действие, а не отдельно папки и файлы. Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки, которые он выделил, параметром захватывались моей программе. |
Автор: antonn 01.05.09, 10:59 |
Цитата Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки пользователь нажимает Ентер в проводнике, проводник выполняет действия проассоциированными с этими объектами: файл откроет в твоей программе, папку - в окне (в текущем или новом). |
Автор: leo 01.05.09, 12:19 |
Это ты понять не хочешь, что папки в отличие от файлов не имеют типов\расширений и соотв-но действие по умолчанию для всех папок - это Открыть в эксплорере. Если тебе удастся каким-то способом изменить это поведение, и заставить по enter и даблклику по папке запускать вместо обзора папки твою прогу, то тогда ты не сможешь нормально открывть папки в проводнике. Ты уверен, что тебе и особенно тем, кто будет юзать твою прогу (если конечно таковые найдутся) именно это и нужно ? PS: Для автозапуска ассоциированных программ при клике на конкретных папках юзаются файлы autorun.inf - если эксплорер при открытии папки находит этот файл, то он может запустить прогу, прописанную в авторане, да и то в зависимости от настроек конкретного компа\юзера, т.к. безопасность и свобода личности превыше всего ![]() |
Автор: PIKACHU 01.05.09, 13:19 |
Цитата antonn @ Цитата Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки пользователь нажимает Ентер в проводнике, проводник выполняет действия проассоциированными с этими объектами: файл откроет в твоей программе, папку - в окне (в текущем или новом). Если вы хотите сказать что это не возможно, могу огорчить вас, Winamp же это как то делает. Добавлено Допетрило)))))))))), благодоря andrew.virus(спосибо огроооооооомное), надо было заменить <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> .xxx\shell\open\command на <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> .xxx\shell\Открыть в "ХХХ Explorer"\command Эксплоеру видимо обезательно чтобы в Directory\shell присудствовала строка точно такая же с каким типом файлов ее открываешь |