如何将程序与文件类型关联,但仅限于当前用户?

时间:2011-06-08 22:02:14

标签: delphi windows-7 windows-vista registry

因此,我无法将我的程序与特定文件类型相关联,而不会强迫穷人输入其管理员密码(对于家庭用户来说可能没问题,但对于公司环境中的用户来说这是一个巨大的问题)。在这种情况下,唯一的解决方案是仅为当前用户建立关联。

我试过了,但有些东西不起作用。

如果我理解正确的话,我必须在ctCurUserFileExt中写一个像(例如)'.mp3'这样的密钥并写入类似'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 个答案:

答案 0 :(得分:20)

如果要为每个用户注册关联,请将数据写入

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打开。最后一行告诉资源管理器“重新加载”自身以反映对文件关联所做的更改。例如,资源管理器文件列表视图将更新。 WinAPI函数SHChangeNotifyShlObj.pas中声明,因此您需要uses ShlObj

请注意%1中的shell\open\command会扩展为当前文件。例如,如果双击C:\some dir\test.myfile,则Explorer将执行命令

C:\WINDOWS\notepad.exe "C:\some dir\test.myfile"

答案 1 :(得分:2)

您是否按照http://support.microsoft.com/kb/257592

查看了在HKEY_CURRENT_USER \ Software \ Classes下设置它?