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

WeG*_*ars 15 delphi registry windows-vista windows-7

所以,我无法将程序与特定文件类型,而不强迫穷人用户输入的管理员密码关联(它可能是确定为家庭用户,但它是为用户在企业ENV一个巨大的问题).在这种情况下,唯一的解决方案是仅为当前用户建立关联.

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

如果我理解正确,我必须在ctCurUserFileExt中写一个像(例如)'.mp3'这样的密钥并写入类似'my_file'的东西.然后在ctCurUserClases中我添加一个这样的键:

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

但是,当我双击该文件时,Windows会询问我应该打开它的应用程序.

这是常数:

CONST
     RootKey= 'HKEY_CURRENT_USER';
     ctCurUserFileExt= '\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\';
     ctCurUserClases = '\Software\Classes\';
Run Code Online (Sandbox Code Playgroud)

And*_*and 20

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

HKEY_LOCAL_MACHINE\Software\Classes
Run Code Online (Sandbox Code Playgroud)

如果只想为当前用户注册关联,请将数据写入

HKEY_CURRENT_USER\Software\Classes
Run Code Online (Sandbox Code Playgroud)

这是后者的方法:

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);
Run Code Online (Sandbox Code Playgroud)

这将关联.myfile文件,称为"我自己的文本文件类型",以便它们将具有notepad.exe的图标,并将由notepad.exe打开.最后一行告诉Explorer"重新加载"自身以反映对文件关联所做的更改.例如,资源管理器文件列表视图将更新.WinAPI函数SHChangeNotify已声明ShlObj.pas,因此您需要uses ShlObj.

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

C:\WINDOWS\notepad.exe "C:\some dir\test.myfile"
Run Code Online (Sandbox Code Playgroud)