如何将程序与文件类型关联,但仅适用于当前用户?
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函数SHChangeNotify
在ShlObj.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 但仅适用于用户