Как связать программу с типом файла, но только для текущего пользователя? - PullRequest
15 голосов
/ 09 июня 2011

Таким образом, я не могу связать свою программу с определенным типом файла, не вынуждая бедного пользователя вводить пароль администратора (это может быть нормально для домашних пользователей, но это гигантская проблема для пользователей в корпоративной среде). В этом случае единственное решение - создать ассоциацию только для текущего пользователя.

Я пробовал это, но что-то не работает.

Если я правильно понимаю, я должен написать ключ (например, '.mp3') в ctCurUserFileExt и написать в нем что-то вроде 'my_file'. Затем в ctCurUserClases я добавляю такой ключ:

WriteReg_String(RootKey, ctCurUserClases+ 'my_file\shell\open\command', '', Application.ExeName+ ' "%L"', TRUE) 

Однако, когда я дважды щелкаю файл, Windows спрашивает меня, с каким приложением ему открывать.

Вот постоянная:

CONST
     RootKey= 'HKEY_CURRENT_USER';
     ctCurUserFileExt= '\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\';
     ctCurUserClases = '\Software\Classes\';

Ответы [ 2 ]

20 голосов
/ 09 июня 2011

Если вы хотите зарегистрировать ассоциацию для каждого пользователя, запишите свои данные в

HKEY_LOCAL_MACHINE\Software\Classes

Если вы хотите зарегистрировать ассоциацию только для текущего пользователя, запишите свои данные в

HKEY_CURRENT_USER\Software\Classes

Вот как это сделать:

with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    if OpenKey('\Software\Classes\.myfile', true) then
      WriteString('', 'MyAppDataFile');
    if OpenKey('\Software\Classes\MyAppDataFile', true) then
      WriteString('', 'My Very Own Text File Type');
    if OpenKey('\Software\Classes\MyAppDataFile\DefaultIcon', true) then
      WriteString('', 'C:\WINDOWS\notepad.exe');
    if OpenKey('\Software\Classes\MyAppDataFile\shell\open\command', true) then
      WriteString('', 'C:\WINDOWS\notepad.exe "%1"');
  finally
    Free;
  end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);

Это свяжет файлы .myfile, называемые «Мой очень собственный тип текстового файла», так что они будут иметь значок notepad.exe и будутоткрыл notepad.exe.Последняя строка указывает Explorer «перезагрузить» себя, чтобы отразить изменения, внесенные в ассоциации файлов.Например, представления списка файлов Explorer будут обновлены.Функция WinAPI SHChangeNotify объявлена ​​в ShlObj.pas, поэтому вам нужно uses ShlObj.

Обратите внимание, что %1 в shell\open\command развернется до текущего файла.Например, если вы дважды щелкните по C:\some dir\test.myfile, то Explorer выполнит команду

C:\WINDOWS\notepad.exe "C:\some dir\test.myfile"
2 голосов
/ 09 июня 2011

Вы смотрели на установку этого в HKEY_CURRENT_USER \ Software \ Classes согласно http://support.microsoft.com/kb/257592

...