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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义URI处理程序:Outlook集成?相关的知识,希望对你有一定的参考价值。

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

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

  • 我们在HKEY_CURRENT_USERSoftwareClassesapp下注册了URI-Handler,所以从WIN + R调用它会使应用程序完美无缺。

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

答案

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

我还在寻找一个合适的解决方案,只是想把这个“已经”留在这里了。

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


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


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

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

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

使用风险 - 我的测试在非常狭隘的环境中是积极的。

Config.MyApplicationURLHandler替换为您的可执行文件,即C:PathToExecutable %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_USERSoftwarePoliciesMicrosoftOffice16.0CommonSecurityTrusted ProtocolsAll Applicationsmms:

如果某些键不存在则只需创建它们。

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

以上是关于自定义URI处理程序:Outlook集成?的主要内容,如果未能解决你的问题,请参考以下文章

VSCode 配置 用户自定义代码片段 自定义自动代码补充

如何使用自定义协议从 Android 浏览器打开 Microsoft Outlook 应用程序?

Instagram redirect_uri 的自定义架构

访问自定义 Outlook 日历条目

WordPress电子邮件共享按钮无法在Outlook中打开

Outlook 自定义菜单按钮