Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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 @
класно, то что надо), только есть одно но, в папке не роется(

а зачем рыться? можно вызывать файлы простым анализом выделенной группы файлом из проводника ... а если нужно как ты говоришь "рыться в папке", то перебирай их, например, методами описанными в этой статье ...

Автор: 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
Цитата PIKACHU @
Не получается, та же реакция

что именно не получается - добавить действие для конкретного типа файлов (папок) или бросать файлы на форму и обрабатывать их ....

можно сделать также переписав функции ассоциирования приложения с файлами и обработчик 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
Цитата PIKACHU @
Не понели вы меня),

Это ты понять не хочешь, что папки в отличие от файлов не имеют типов\расширений и соотв-но действие по умолчанию для всех папок - это Открыть в эксплорере. Если тебе удастся каким-то способом изменить это поведение, и заставить по 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 присудствовала строка точно такая же с каким типом файлов ее открываешь

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)