Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 21.01.2014, 11:17   #1
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию Как узнать программу, которая стоит в виндовс по умолчанию для открытия определенного типа файла

Всем привет, хочу сделать программу в которой ты выбираешь файл а она выдает тебе название программы которая стоит в виндовс по умолчанию для открытия определенного типа файлов(если такой тип известен и есть чем открыть). Не знаю как реализовать в голове пока пробовать открыть файл, потом отслеживать появившийся процесс брать его название и сразу убивать, может как то попроще можно? Или если у нас есть название установленной программы то никак нельзя узнать с какими файлами она работает??
Konstantin_ua вне форума Ответить с цитированием
Старый 21.01.2014, 11:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

http://www.programmersforum.ru/showthread.php?t=139066
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.01.2014, 12:51   #3
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
да очень полезная информация, ну я вот тут запутался чуток, создаем объект класса TRegistry для роботы с реестром, заносим в него информацию, проверяем существует ли ключ, открываем его и копируем в резаулт ну зачем там еще етот кусочек
Код:
  r.OpenKeyReadOnly('\'+Result+'\Shell\Open\Command');
    Result := r.ReadString('');
(если я что то не так написал поправите)

Код:
function TForm1.ExeForExt(Ext: String): String;
var r: TRegistry;
begin
  r := TRegistry.Create(KEY_READ);
  try
    r.RootKey := HKEY_CLASSES_ROOT;
    if not r.KeyExists(Ext) then Exit;
    r.OpenKeyReadOnly('\'+ext);
    Result := r.ReadString('');
    r.CloseKey;
    r.OpenKeyReadOnly('\'+Result+'\Shell\Open\Command');
    Result := r.ReadString('');
  finally
    r.CloseKey;
    r.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := ExeForExt('.txt');
end;
и еще интересно в реестре лежит информация только об одной программе которая ассоциируется с определенным типом файлов?
Konstantin_ua вне форума Ответить с цитированием
Старый 21.01.2014, 13:53   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,593
По умолчанию

См. реестр
По первому ключу ты получишь символическое название типа файла с таким расширением. Для .mp3 это будет, например у меня, Winamp.File.MP3
Далее ты ищешь ключ с таким названием и если он есть, то у него уже в подключе Shell\Open\Command найдешь строку запуска такого файла. Первая часть этой строки даст имя ЕХЕ-файла ассоциированного с этим файлом.
northener вне форума Ответить с цитированием
Старый 21.01.2014, 16:48   #5
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
См. реестр
По первому ключу ты получишь символическое название типа файла с таким расширением. Для .mp3 это будет, например у меня, Winamp.File.MP3
Далее ты ищешь ключ с таким названием и если он есть, то у него уже в подключе Shell\Open\Command найдешь строку запуска такого файла. Первая часть этой строки даст имя ЕХЕ-файла ассоциированного с этим файлом.
если я хочу узнать с которыми файлами работает программа, нужно взять имя приложения, по нему получить информацию про ключ с помощью OpenKey('Software\Microsoft\Windows \CurrentVersion\Uninstall\'+ mmo1.Lines[4], False); (в мемо у меня список установленных программ) а как дальше???
Konstantin_ua вне форума Ответить с цитированием
Старый 21.01.2014, 17:18   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,593
По умолчанию

Цитата:
а как дальше?
Перебором всех ключей в HKEY_CLASSES_ROOT. А с прицелом на будущее (по нынешним рекомендациям MS) в HKEY_LOCAL_MACHINE\SOFTWARE\Classes и в HKEY_CURRENT_USER\SOFTWARE\Classes.
northener вне форума Ответить с цитированием
Старый 21.01.2014, 17:46   #7
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Перебором всех ключей в HKEY_CLASSES_ROOT. А с прицелом на будущее (по нынешним рекомендациям MS) в HKEY_LOCAL_MACHINE\SOFTWARE\Classes и в HKEY_CURRENT_USER\SOFTWARE\Classes.
если пробую такой код то ничего вообще не показывает
Код:
procedure TForm1.btn4Click(Sender: TObject);
Var   MyList: TStringList;
      i: Integer;
      Str: string;
      Reg : TRegistry;

Begin
  Reg := TRegistry.Create;
  MyList:=TStringList.Create;
  with Reg do
    begin
      RootKey:=HKEY_LOCAL_MACHINE;
      if OpenKey('HKEY_LOCAL_MACHINE\SOFTWARE\Classes',False)=True then GetKeyNames(MyList);
      CloseKey;
      for i:=0 to MyList.Count-1 do
        begin
          RootKey:=HKEY_LOCAL_MACHINE;
          OpenKey('HKEY_LOCAL_MACHINE\SOFTWARE\Classes'+ MyList[i], False);
            if ValueExists(MyList[i]) then
              ShowMessage(ReadString(MyList[i]))
            else
            ShowMessage('Ïàðàìåòð íå íàéäåí');
          CloseKey;
        end;
    end;
    Reg.destroy;
end;
(если написал бред пожалуйста не ругайтесь а исправьте)
Konstantin_ua вне форума Ответить с цитированием
Старый 21.01.2014, 17:47   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

а почему не
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx ?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.01.2014, 18:12   #9
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если я правильно разобрался, эта функция возвращает имя приложения работающего с данным типом файлов, а мне хотелось бы узнать с какими файлами работает выбранная программа
Konstantin_ua вне форума Ответить с цитированием
Старый 21.01.2014, 19:28   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,444
По умолчанию

Перечисляете типы файлов из CLASSES_ROOT и прогоняете по FindExecutable
Человек_Борща вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать Веб-браузер, который стоит по-умолчанию в системе? Vova777 Общие вопросы Delphi 3 31.03.2013 18:39
форма ввода пароля для открытия определенного листа Excel zenner Microsoft Office Excel 2 22.08.2012 13:47
Как узнать цвет определенного пикселя? pavellyba Мультимедиа в Delphi 3 21.06.2011 08:19
Как изменить путь сохранения/открытия проекта по умолчанию? fs444 Общие вопросы C/C++ 0 22.01.2010 14:03
Создание файла определенного типа Македонский Общие вопросы Delphi 12 06.09.2007 11:58