На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Открытие файлов из проводника
    Выделяем НЕСКОЛЬКО файлов в проводнике, зарегистрированых за моей прогой, нажимаем Enter и почему то передается только выделеный файл, как передать все файлы моей программе

    ПС спосибо за уделенное время
      Регистрировать свое расширение оболочки реализующее интерфейс IShellExtInit и в IShellExtInit.Initialize брать все выделенные элементы и передавать своей программе.
        А через парамстр ни как? Я боюсь ета ерунда систему тормозить будет.
          Винда производит последовательные вызовы
          ExpandedWrap disabled
            YourProgram.exe C:\File1.ext
          ExpandedWrap disabled
            YourProgram.exe C:\File2.ext
          ExpandedWrap disabled
            YourProgram.exe C:\File3.ext
          научите программу работать только в одном экземпляре, а вторую копию — передавать параметр запуска первой перед закрытием. Так проще? :)
            PIKACHU для запрета запуска второй копии программы посмотри эту тему ...

            передавать данные между экземплярами можно, например, используя сообщение WM_COPYDATA ...
              PIKACHU пример, который выполняет требуемое тебе в прилагаемом архиве ...

              он открывает в одном приложении несколько файлов (новая копия отсылает параметр и закрывается) ... надеюсь поможет ... ;)
              Прикреплённый файлПрикреплённый файлxxx_explorer.zip (6.9 Кбайт, скачиваний: 194)
                Класно, то что надо), только есть одно но, в папке не роется(
                Сообщение отредактировано: PIKACHU -
                  Цитата PIKACHU @
                  класно, то что надо), только есть одно но, в папке не роется(

                  а зачем рыться? можно вызывать файлы простым анализом выделенной группы файлом из проводника ... а если нужно как ты говоришь "рыться в папке", то перебирай их, например, методами описанными в этой статье ...
                    В том то и дело что при отрытии группы файлов, зарегеные файлы открываются как надо, а папка открывается в эксплоере, мож надо как то регить папку?
                    Сообщение отредактировано: PIKACHU -
                      Цитата PIKACHU @
                      В том то и дело что при отрытии группы файлов, зарегеные файлы открываются как надо, а папка открывается в эксплоере, мож надо как то регить папку?

                      написанно не совсем понятно - попробую потелепатить немного, если проравильно понял, то нужно такое ... при выборе из программы папки на открытие программа перебирает все файлы зарегистрированного типа в ней и открывает их ...

                      для реализации этого можно использовать такой код:

                      ExpandedWrap disabled
                        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)
                        Не то, поиск я знаю как сделать, например(смотреть в картинку), файлы типа xxx открываются в программе а папка test folder открывается в эксплоеере надо чтоб эксплоер передовал путь папки.
                        Прикреплённый файлПрикреплённый файлtest.JPG (75.36 Кбайт, скачиваний: 436)
                          Цитата PIKACHU @
                          Не то, поиск я знаю как сделать, например(смотреть в картинку), файлы типа xxx открываются в программе а папка test folder открывается в эксплоеере надо чтоб эксплоер передовал путь папки.

                          такой реакции для папок можно добиться если зарегистрировать для меню "Открыть с помощью ..." твое приложение (раздел, если не ошибаюсь [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.directory\OpenWithList]) ...

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

                          Цитата
                          создать команду, применимую к любой папке, диску и т.п.
                          В разделе HKEY_CLASSES_ROOT\Folder\shell создайте новый раздел, назвав его своим именем (например "Огого"). В параметре "По умолчанию" задайте имя команды (например "Команда Огого"). Создайте раздел Command в разделе "Огого" и запишите свою команду.
                          Сообщение отредактировано: andrew.virus -
                            что то меня смущает HKEY_CURRENT_USER, а в HKEY_LOCAL_MACHINE нельзя?

                            ПС Еще не проверял, на работе нет Delphi
                              Не получается, та же реакция
                                Цитата PIKACHU @
                                Не получается, та же реакция

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

                                можно сделать также переписав функции ассоциирования приложения с файлами и обработчик OnCreate таким образом ...

                                ExpandedWrap disabled
                                  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;

                                з.ы.: в архиве изменненный вариант примера решения ...
                                Сообщение отредактировано: andrew.virus -

                                Прикреплённый файлПрикреплённый файлxxx_explorer_2009.04.30.zip (14.52 Кбайт, скачиваний: 128)
                                  Извеняюсь но не то, это я уже понел как делать, какроче Winamp так может, при выдилении файлов и папок winampу как то передаются все файлы и папки, а у меня файлы передаются, а папки открываются просто в эксплоере, а мне надо еще передать путь папки своей программе.

                                  ПС: Надеюсь теперь понятно)
                                  Сообщение отредактировано: PIKACHU -
                                    Все еще жду ответа(

                                    ПС: Бедный мой реестр)
                                      Цитата PIKACHU @
                                      Извеняюсь но не то, это я уже понел как делать, какроче Winamp так может, при выдилении файлов и папок winampу как то передаются все файлы и папки, а у меня файлы передаются, а папки открываются просто в эксплоере, а мне надо еще передать путь папки своей программе.

                                      для решения этой проблемы просто нужно добавить команду "Открыть в "XXX Explorer" ..." и для ассоциированных файлов и пользоваться ей ... помнится Winamp добавляет пункт "Открыть в Winamp ..." ...

                                      код меняется только для процедур регистрации и открытия переданного параметра и будет таким ....

                                      ExpandedWrap disabled
                                        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)
                                        Не понели вы меня), это отдельный случай, его я уже давно сделал.


                                        При выделении файлов .ххх, только файлов, все работает. А если в эту группу выделеных файлов выделить и папку, то пути файлов передаются в программу открываются, а папка нет. Передача файлов и папок доложна передаватся за одно действие, а не отдельно папки и файлы. Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки, которые он выделил, параметром захватывались моей программе.
                                          Цитата
                                          Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки

                                          пользователь нажимает Ентер в проводнике, проводник выполняет действия проассоциированными с этими объектами: файл откроет в твоей программе, папку - в окне (в текущем или новом).
                                            Цитата PIKACHU @
                                            Не понели вы меня),

                                            Это ты понять не хочешь, что папки в отличие от файлов не имеют типов\расширений и соотв-но действие по умолчанию для всех папок - это Открыть в эксплорере. Если тебе удастся каким-то способом изменить это поведение, и заставить по enter и даблклику по папке запускать вместо обзора папки твою прогу, то тогда ты не сможешь нормально открывть папки в проводнике. Ты уверен, что тебе и особенно тем, кто будет юзать твою прогу (если конечно таковые найдутся) именно это и нужно ?
                                            PS: Для автозапуска ассоциированных программ при клике на конкретных папках юзаются файлы autorun.inf - если эксплорер при открытии папки находит этот файл, то он может запустить прогу, прописанную в авторане, да и то в зависимости от настроек конкретного компа\юзера, т.к. безопасность и свобода личности превыше всего ;)
                                              Цитата antonn @
                                              Цитата
                                              Тоесть пользователь выделил папку и файл нажал Enter и все файлы и папки

                                              пользователь нажимает Ентер в проводнике, проводник выполняет действия проассоциированными с этими объектами: файл откроет в твоей программе, папку - в окне (в текущем или новом).

                                              Если вы хотите сказать что это не возможно, могу огорчить вас, Winamp же это как то делает.

                                              Добавлено
                                              Допетрило)))))))))), благодоря andrew.virus(спосибо огроооооооомное), надо было заменить
                                              ExpandedWrap disabled
                                                .xxx\shell\open\command


                                              на

                                              ExpandedWrap disabled
                                                .xxx\shell\Открыть в "ХХХ Explorer"\command



                                              Эксплоеру видимо обезательно чтобы в Directory\shell присудствовала строка точно такая же с каким типом файлов ее открываешь
                                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0537 ]   [ 15 queries used ]   [ Generated: 18.05.24, 03:44 GMT ]