2011-06-08 34 views
11

因此,我无法将我的程序与特定的文件类型关联起来,而不会强制穷人输入其管理员密码(对于家庭用户来说这可能没问题,但对于企业环境中的用户来说这是一个巨大的问题)。在这种情况下,唯一的解决方案是仅为当前用户建立关联。如何将Delphi程序与文件类型相关联,但仅限于当前用户?

我试过,但有些东西不能正常工作。

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

[可能的重复数据删除技术(HTTP命令:/ /stackoverflow.com/questions/4585078/how-to-change-file-association-programmatically-without-require-elevation) – NGLN 2011-06-08 22:05:08

+1

嗨Ngln。它不是一个愚蠢的。这是关于如何关联所有用户(需要提升)。我需要没有提升(所以,只为当前用户)。 – Ampere 2011-06-08 22:24:12

+1

顺便说一句,为什么不使用TRegistry? – 2011-06-08 22:25:20

回答

16

如果你想注册为每个用户的关联,如果你想注册为当前用户的相关数据写入

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

请注意%1shell\open\command将展开到当前文件。举例来说,如果你在C:\some dir\test.myfile双击,然后资源管理器将执行

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

所以,我不得不在ctCurUserClases中添加这两个条目?我想我需要在ctCurUserClases中添加一个,在ctCurUserFileExt中添加一个。 – Ampere 2011-06-08 22:18:00

+0

@ user759588 - 实际上这是错误的。 HKEY_CLASSES_ROOT是HKLM的入口点,而不是HKCU的入口点。 – Ampere 2011-06-08 22:19:17

+0

@Altar,真的,我纠正了。 – 2011-06-08 22:30:40

2

你看在HKEY_CURRENT_USER \ Software \ Classes下将其设置为每http://support.microsoft.com/kb/257592

+0

是的。它没有说很多。 – Ampere 2011-06-08 23:46:47

+0

它的工作方式与全局设置完全相同,除了用户特定的地方放置密钥以获取文件关联外。 – BugFinder 2011-06-09 05:24:07

相关问题