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

Posted

技术标签:

【中文标题】如何将程序与文件类型关联,但仅适用于当前用户?【英文标题】:How to associate a program with a file type, but only for the current user? 【发布时间】:2011-09-11 06:19:02 【问题描述】:

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

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

如果我理解正确,我必须在 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\';

【问题讨论】:

Possible dupe 嗨 Ngln。它不是骗子。那是关于如何为所有用户关联(需要提升)。我需要没有海拔(因此,仅适用于当前用户)。 顺便说一句,为什么不使用 TRegistry? 【参考方案1】:

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

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

注意shell\open\command 中的%1 将扩展为当前文件。比如双击C:\some dir\test.myfile,资源管理器就会执行命令

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

【讨论】:

那么,我必须在 ctCurUserClases 中添加两个条目吗?我想我需要在 ctCurUserClases 中添加一个,在 ctCurUserFileExt 中添加一个。 @Altar:HKCR 是 HKLM 和 HKCU 的合并视图。该视图使用来自 HKLM 的默认值进行初始化,然后将 HKCU 值放置在其之上。阅读 MSDN 了解更多详情:msdn.microsoft.com/en-us/library/ms724475.aspx 和 msdn.microsoft.com/en-us/library/ms724498.aspx。 我看到大多数程序都使用 %L 而不是 %1。有什么区别? @Altar:我从未见过 %L,但 %1 一直用于此目的。我怀疑你把它们弄混了。 免费库 DSiWin32 (gpdelphiunits.googlecode.com/svn/trunk/src/DSiWin32.pas) 现在将其实现为 DSiRegisterUserFileAssoc 和 DSiUnregisterUserFileAssoc。【参考方案2】:

您是否查看过按照http://support.microsoft.com/kb/257592 在 HKEY_CURRENT_USER\Software\Classes 下设置它

【讨论】:

它的工作方式与全局设置完全一样,除了用户特定的位置可以放置密钥以获取文件关联。

以上是关于如何将程序与文件类型关联,但仅适用于当前用户?的主要内容,如果未能解决你的问题,请参考以下文章

pipenv install --system 但仅适用于用户

如何将多行合并为单行,但仅适用于由空行分隔的行块

如何获取SVN中文件/文件夹属性的历史记录?

如何将文件类型与 iPhone 应用程序相关联?

MySQL:错误 1217 (23000):无法删除或更新父行:外键约束失败 - 但仅适用于 1 个 sql 文件

如何将应用程序与文件类型(文件扩展名)关联起来?