自定义URI处理程序:Outlook集成?

时间:2018-03-01 16:49:53

标签: c# outlook

对于我们的应用程序,我们有一个自定义uri处理程序,它允许从外部源(即app://viewProduct/225545568)打开应用程序内的一些视图

这种工作正常,当这样的链接粘贴在电子邮件中时,Outlook不会将其转换为"可点击的"链接。

  • 我们在HKEY_CURRENT_USER\Software\Classes\app下注册了URI-Handler,因此从WIN + R调用它会使应用程序完美无缺。

有没有办法让Outlook能够理解(注册)URI以自动将它们变成HyperLinks? (或者我们是否需要部署某种公司范围的宏来实现这一目标?)

1 个答案:

答案 0 :(得分:0)

这是一个非常好的解决方法:

我还在寻找一个合适的解决方案,只是想离开这个地方"在这里"已经。

经过一番研究,我发现Outlook默认链接了一定数量的"协议" (硬编码):所以我试图注册"我的"使用mms协议的应用程序,这是我们在商业环境中不需要的。

首次尝试删除,仅适用于Windows 7

所以我玩了一下,并想通了,Windows 7和Windows 10需要以下密钥才能让事情顺利进行。

注意:对于Windows 10,这只会"注册"您的应用程序作为协议的合适默认应用程序。您必须使用" Windows 10的默认应用程序 - >手动分配应用程序。按协议" -Menu。 (只要这适用于Chrome - 因此Google-Devs没有解决方法 - 我不会在此花费任何时间:P)

好消息:在任何系统上设置所有键并不会导致任何问题。 (所以,让我们忽略一点注册表污染:-))

自担风险 - 我的测试是在一个非常狭隘的环境中进行的。

Config.MyApplicationURLHandler替换为您的可执行文件,即C:\Path\To\Executable %1MyApplication替换为您的应用程序名称。

private void RegisterMyProtocol()
{
     //Step 1: Register for the MMS-Protocol. 
    //Thats some media plaer stuff, we don't need at all. 
    //We use this, because it will be autolinked in Outlook / word / excel. 
    RegistryKey key = CreateRegistryChain(Registry.CurrentUser, "Software/CLASSES/mms");
    key.SetValue(string.Empty, "URL:mms Protocol");
    key.SetValue("URL Protocol", string.Empty);
    key.Close();

    key = CreateRegistryChain(Registry.CurrentUser, "Software/CLASSES/mms/shell/open/command");
    key.SetValue(string.Empty, Config.MyApplicationURLHandler);
    key.Close();

    //Step 2: Create required entries for windows 10. 
    //NOTE: Win 10 Users need to select Uri-Schemes manually.
    key = CreateRegistryChain(Registry.CurrentUser, "Software/CLASSES/mms/shell/open/command");
    key.SetValue(string.Empty, Config.MyApplicationURLHandler);
    key.Close();

    key = CreateRegistryChain(Registry.CurrentUser, "Software/MyApplication/Capabilities");
    key.SetValue("ApplicationDescription", "MyApplication");
    key.SetValue("ApplicationName", "MyApplication");
    key.Close();

    key = CreateRegistryChain(Registry.CurrentUser, "Software/MyApplication/Capabilities/URLAssociations");
    key.SetValue("mms", "mms");
    key.Close();

    key = CreateRegistryChain(Registry.CurrentUser, "SOFTWARE/RegisteredApplications");
    key.SetValue("MyApplication", "Software\\MyApplication\\Capabilities");
    key.Close();

    //Step 3: Remove the original UrlAssociation. 
    key = CreateRegistryChain(Registry.CurrentUser, "SOFTWARE/Microsoft/Windows/Shell/Associations/UrlAssociations");
    if (key.GetSubKeyNames().Contains("mms"))
    {
        key.DeleteSubKey("mms");
    }
    key.Close();
}

private RegistryKey CreateRegistryChain(RegistryKey root, String keyChain){
    String[] keys = keyChain.Split('/');

    foreach(String key in keys)
    {
        if (!root.GetSubKeyNames().Contains(key))
        {
            root.CreateSubKey(key, true);
        }

        root = root.OpenSubKey(key, true);
    }

    return root;
}

注意:默认情况下,mms-Protocol会导致Outlook显示安全警告。因此,要么通过GPO将协议添加到受信任的协议,要么使用注册表项:

(版本16.0需要与您的Outlook版本匹配)

HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\16.0\Common\Security\Trusted Protocols\All Applications\mms:

如果某些密钥不存在,只需创建它们。

请勿忘记清理应用程序中的输入,因为我们不想处理使用mms协议的真实内容。 : - )