我使用此代码检查outlook是否为默认邮件客户端:
Function IsOutlookIsDefaultEmailPrg:Boolean;
var
reg: TRegistry;
key : string;
begin
Result := False;
with TRegistry.Create do
TRY
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly('Software\Clients\Mail') then
begin
key := Uppercase(ReadString('')); //default value
end;
result := (Pos('MICROSOFT OUTLOOK',Key) > 0);
FINALLY
Free;
END;
end;
它的工作原理一般,但在某些电脑上据说它无法正常工作,我检查了注册表密钥。
Pos
是否区分大小写?知道为什么这个有时不起作用吗?还有更好的建议吗?
答案 0 :(得分:5)
我看到您正在使用HKLM密钥来检查默认客户端,但这可以是用户依赖的,因此您应该检查HKCU条目(如果HKCU没有条目,则回退到HKLM)。
我还删除了With
语句,并使用ContainsText
(包含StrUtils
单位)功能代替Pos
:
function IsOutlookTheDefaultEmailClient:Boolean;
var
Reg : TRegistry;
begin
Result := False;
Reg := TRegistry.Create;
try
// first check HKCU
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKeyReadOnly('Software\Clients\Mail') then
begin
Result := ContainsText(Reg.ReadString(''), 'Microsoft Outlook');
Reg.CloseKey;
end
// fall back to HKLM
else
begin
Reg.RootKey := HKEY_LOCAL_MACHINE;
// this part is susceptible to registry virtualization and my need elevation!
if Reg.OpenKeyReadOnly('Software\Clients\Mail') then
begin
Result := ContainsText(Reg.ReadString(''), 'Microsoft Outlook');
Reg.CloseKey;
end;
end;
finally
Reg.Free;
end;
end;
修改强>
此代码失败的唯一时间是Registry virtualization发挥作用。这在UAC场景中很常见。 如果此密钥存在于regedit中,请检查发生故障的计算机:
HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Clients\Mail
如果是这种情况,您的应用程序将读取此密钥而不是真正的HKLM密钥。唯一的解决方案是提升请求或以管理员身份运行您的应用程序。
答案 1 :(得分:2)
这是我对这些问题的理解:
Pos
函数区分大小写。因此,如果值为Microsoft Outlook
,那么您的测试将无法找到它。您应该使用ContainsText
。这不仅符合您的要求,而且比Pos()>0
更具可读性。HKCU\Software\Clients\Mail
中的system checks first。如果没有找到默认邮件客户端,则它会检入HKLM\Software\Clients\Mail
。你也应该这样做。HKCU\Software\Clients
和HKLM\Software\Clients\Mail
均为shared。在早期版本的Windows上,它们是redirected。那里有可能出错。您应该使用KEY_WOW64_64KEY
来访问注册表的64位视图。