Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.252.87] |
|
Сообщ.
#1
,
|
|
|
Выделяем НЕСКОЛЬКО файлов в проводнике, зарегистрированых за моей прогой, нажимаем Enter и почему то передается только выделеный файл, как передать все файлы моей программе
ПС спосибо за уделенное время |
Сообщ.
#2
,
|
|
|
Регистрировать свое расширение оболочки реализующее интерфейс IShellExtInit и в IShellExtInit.Initialize брать все выделенные элементы и передавать своей программе.
|
Сообщ.
#3
,
|
|
|
А через парамстр ни как? Я боюсь ета ерунда систему тормозить будет.
|
Сообщ.
#4
,
|
|
|
Винда производит последовательные вызовы
YourProgram.exe C:\File1.ext YourProgram.exe C:\File2.ext YourProgram.exe C:\File3.ext |
Сообщ.
#5
,
|
|
|
PIKACHU для запрета запуска второй копии программы посмотри эту тему ...
передавать данные между экземплярами можно, например, используя сообщение WM_COPYDATA ... |
Сообщ.
#6
,
|
|
|
PIKACHU пример, который выполняет требуемое тебе в прилагаемом архиве ...
он открывает в одном приложении несколько файлов (новая копия отсылает параметр и закрывается) ... надеюсь поможет ... Прикреплённый файлxxx_explorer.zip (6.9 Кбайт, скачиваний: 194) |
Сообщ.
#7
,
|
|
|
Класно, то что надо), только есть одно но, в папке не роется(
|
Сообщ.
#8
,
|
|
|
Цитата PIKACHU @ класно, то что надо), только есть одно но, в папке не роется( а зачем рыться? можно вызывать файлы простым анализом выделенной группы файлом из проводника ... а если нужно как ты говоришь "рыться в папке", то перебирай их, например, методами описанными в этой статье ... |
Сообщ.
#9
,
|
|
|
В том то и дело что при отрытии группы файлов, зарегеные файлы открываются как надо, а папка открывается в эксплоере, мож надо как то регить папку?
|
Сообщ.
#10
,
|
|
|
Цитата PIKACHU @ В том то и дело что при отрытии группы файлов, зарегеные файлы открываются как надо, а папка открывается в эксплоере, мож надо как то регить папку? написанно не совсем понятно - попробую потелепатить немного, если проравильно понял, то нужно такое ... при выборе из программы папки на открытие программа перебирает все файлы зарегистрированного типа в ней и открывает их ... для реализации этого можно использовать такой код: 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; з.ы.: полный код примера в прилагаемом архиве .... Прикреплённый файлxxx_explorer_new.zip (14.37 Кбайт, скачиваний: 124) |
Сообщ.
#11
,
|
|
|
Не то, поиск я знаю как сделать, например(смотреть в картинку), файлы типа xxx открываются в программе а папка test folder открывается в эксплоеере надо чтоб эксплоер передовал путь папки.
Прикреплённый файлtest.JPG (75.36 Кбайт, скачиваний: 436) |
Сообщ.
#12
,
|
|
|
Цитата PIKACHU @ Не то, поиск я знаю как сделать, например(смотреть в картинку), файлы типа xxx открываются в программе а папка test folder открывается в эксплоеере надо чтоб эксплоер передовал путь папки. такой реакции для папок можно добиться если зарегистрировать для меню "Открыть с помощью ..." твое приложение (раздел, если не ошибаюсь [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.directory\OpenWithList]) ... но если просто бросать файлы на форму приложения и обрабатывать их то посмотри материалы этой темы ... еще один вариант решения задачи это регистрация для папок пункта меню "Открыть в MyProject" для контекстного меню ... Цитата создать команду, применимую к любой папке, диску и т.п. В разделе HKEY_CLASSES_ROOT\Folder\shell создайте новый раздел, назвав его своим именем (например "Огого"). В параметре "По умолчанию" задайте имя команды (например "Команда Огого"). Создайте раздел Command в разделе "Огого" и запишите свою команду. |
Сообщ.
#13
,
|
|
|
что то меня смущает HKEY_CURRENT_USER, а в HKEY_LOCAL_MACHINE нельзя?
ПС Еще не проверял, на работе нет Delphi |
Сообщ.
#14
,
|
|
|
Не получается, та же реакция
|
Сообщ.
#15
,
|
|
|
Цитата PIKACHU @ Не получается, та же реакция что именно не получается - добавить действие для конкретного типа файлов (папок) или бросать файлы на форму и обрабатывать их .... можно сделать также переписав функции ассоциирования приложения с файлами и обработчик OnCreate таким образом ... 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; з.ы.: в архиве изменненный вариант примера решения ... Прикреплённый файлxxx_explorer_2009.04.30.zip (14.52 Кбайт, скачиваний: 128) |
Сообщ.
#16
,
|
|
|
Извеняюсь но не то, это я уже понел как делать, какроче Winamp так может, при выдилении файлов и папок winampу как то передаются все файлы и папки, а у меня файлы передаются, а папки открываются просто в эксплоере, а мне надо еще передать путь папки своей программе.
ПС: Надеюсь теперь понятно) |
Сообщ.
#17
,
|
|
|
Все еще жду ответа(
ПС: Бедный мой реестр) |
Сообщ.
#18
,
|
|
|
Цитата PIKACHU @ Извеняюсь но не то, это я уже понел как делать, какроче Winamp так может, при выдилении файлов и папок winampу как то передаются все файлы и папки, а у меня файлы передаются, а папки открываются просто в эксплоере, а мне надо еще передать путь папки своей программе. для решения этой проблемы просто нужно добавить команду "Открыть в "XXX Explorer" ..." и для ассоциированных файлов и пользоваться ей ... помнится Winamp добавляет пункт "Открыть в Winamp ..." ... код меняется только для процедур регистрации и открытия переданного параметра и будет таким .... 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; з.ы.: в прилагаемом архиве пример с последними изменениями ... Прикреплённый файлxxx_explorer_2009.05.01.zip (14.58 Кбайт, скачиваний: 97) |
Сообщ.
#19
,
|
|
|
Не понели вы меня), это отдельный случай, его я уже давно сделал.
При выделении файлов .ххх, только файлов, все работает. А если в эту группу выделеных файлов выделить и папку, то пути файлов передаются в программу открываются, а папка нет. Передача файлов и папок доложна передаватся за одно действие, а не отдельно папки и файлы. Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки, которые он выделил, параметром захватывались моей программе. |
Сообщ.
#20
,
|
|
|
Цитата Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки пользователь нажимает Ентер в проводнике, проводник выполняет действия проассоциированными с этими объектами: файл откроет в твоей программе, папку - в окне (в текущем или новом). |
Сообщ.
#21
,
|
|
|
Цитата PIKACHU @ Не понели вы меня), Это ты понять не хочешь, что папки в отличие от файлов не имеют типов\расширений и соотв-но действие по умолчанию для всех папок - это Открыть в эксплорере. Если тебе удастся каким-то способом изменить это поведение, и заставить по enter и даблклику по папке запускать вместо обзора папки твою прогу, то тогда ты не сможешь нормально открывть папки в проводнике. Ты уверен, что тебе и особенно тем, кто будет юзать твою прогу (если конечно таковые найдутся) именно это и нужно ? PS: Для автозапуска ассоциированных программ при клике на конкретных папках юзаются файлы autorun.inf - если эксплорер при открытии папки находит этот файл, то он может запустить прогу, прописанную в авторане, да и то в зависимости от настроек конкретного компа\юзера, т.к. безопасность и свобода личности превыше всего |
Сообщ.
#22
,
|
|
|
Цитата antonn @ Цитата Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки пользователь нажимает Ентер в проводнике, проводник выполняет действия проассоциированными с этими объектами: файл откроет в твоей программе, папку - в окне (в текущем или новом). Если вы хотите сказать что это не возможно, могу огорчить вас, Winamp же это как то делает. Добавлено Допетрило)))))))))), благодоря andrew.virus(спосибо огроооооооомное), надо было заменить .xxx\shell\open\command на .xxx\shell\Открыть в "ХХХ Explorer"\command Эксплоеру видимо обезательно чтобы в Directory\shell присудствовала строка точно такая же с каким типом файлов ее открываешь |