如何检查outlook是默认的邮件客户端

时间:2014-01-13 15:01:27

标签: delphi outlook delphi-xe2

我使用此代码检查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是否区分大小写?知道为什么这个有时不起作用吗?还有更好的建议吗?

2 个答案:

答案 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)

这是我对这些问题的理解:

  1. Pos函数区分大小写。因此,如果值为Microsoft Outlook,那么您的测试将无法找到它。您应该使用ContainsText。这不仅符合您的要求,而且比Pos()>0更具可读性。
  2. HKCU\Software\Clients\Mail中的system checks first。如果没有找到默认邮件客户端,则它会检入HKLM\Software\Clients\Mail。你也应该这样做。
  3. 在Windows 7及更高版本中,HKCU\Software\ClientsHKLM\Software\Clients\Mail均为shared。在早期版本的Windows上,它们是redirected。那里有可能出错。您应该使用KEY_WOW64_64KEY来访问注册表的64位视图。