因此,我无法将我的程序与特定文件类型相关联,而不会强迫穷人输入其管理员密码(对于家庭用户来说可能没问题,但对于公司环境中的用户来说这是一个巨大的问题)。在这种情况下,唯一的解决方案是仅为当前用户建立关联。
我试过了,但有些东西不起作用。
如果我理解正确的话,我必须在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\';
答案 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函数SHChangeNotify
在ShlObj.pas
中声明,因此您需要uses ShlObj
。
请注意%1
中的shell\open\command
会扩展为当前文件。例如,如果双击C:\some dir\test.myfile
,则Explorer将执行命令
C:\WINDOWS\notepad.exe "C:\some dir\test.myfile"
答案 1 :(得分:2)