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)