【问题标题】:COM Interop & Outlook - Make Outlook Visible?COM 互操作和 Outlook - 使 Outlook 可见?
【发布时间】:2010-05-26 16:07:46
【问题描述】:

我正在通过 VB.NET 程序自动化 Outlook,根据用户的请求将项目传输到日历和联系人中。一切正常,这不是问题;问题是,当 Outlook 尚未打开时,像这样自动化 Outlook 会创建一个隐藏的实例。我也许可以理解这很有用,可以在您仍在处理它时阻止用户关闭它,但是由于 Outlook 似乎只强制一个实例,如果用户尝试检查在我的程序仍在运行时所做的更改连接到 Outlook,什么也没有发生 - 一个实例是隐藏的实例,用户看不到任何东西。

在过去的 COM 自动化时代,我曾经能够使 Word 或 Excel 可见,但我似乎无法在 Outlook 中做到这一点。我试过了:

OutlookApp.Visible = True

OutlookApp.Application.Visible = True

OutlookApp.ActiveWindow.Visible = True

OutlookApp.ActiveExplorer.Display() 

但它们都不起作用。

这并不重要,但有谁知道我是否可以让 Outlook 显示其主窗口?如果我能让它禁止用户关闭实例,我会加分,但我会满足于只显示窗口:)

【问题讨论】:

  • 仅仅 9 年零 9 个月后,我遇到了同样的问题,并找到了一个简单的解决方案,我在下面的答案中描述了该解决方案。无需查看注册表...

标签: com interop outlook visible


【解决方案1】:

您可以像这样显示您的创建邮件:

mailItem.Display();

这是c#代码,但我认为,这不过是接近你的vb。

【讨论】:

    【解决方案2】:

    我通常先测试“Outlook”进程是否正在运行,如果没有,则打开 Outlook.exe 然后附加。这样你就永远不会得到一个隐藏的进程。

    确实没有办法取消关闭的前景,但您可以挂钩应用程序退出事件以断开连接并在您的应用程序中处理。

    【讨论】:

    • 嗯,我想说“我明白,但这取决于知道 Outlook 的路径和文件名......”。现在我终于明白我们确实知道这一点 - 注册表会告诉我们谁提供“Outlook.Application”。所以谢谢 - 很高兴我现在回到这个答案。
    • 如果您现在阅读本文,请查看下面的答案,如果您使用的是 .NET,它会提供更简单的解决方案。
    【解决方案3】:

    我刚才遇到了这个问题,因为我有同样的挑战。我对接受的答案并不完全满意,因为这意味着我必须确定Outlook.exe 的完整路径。 “炮击Outlook.exe”不起作用。因此,我寻找并找到了另一种解决方案。但在我介绍之前,让我们看看如果你想这样做,如何确定Outlook.exe 的完整路径。

    要确定Outlook.exe的完整路径,需要从

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Outlook\InstallRoot

    注册表项(假设您拥有 Office 16,又名 Office 2016 或 2019)并构建 Outlook.exe 的完整路径。在我的机器上,Path 的值为

    • C:\Program Files\Microsoft Office\root\Office16

    所以完整路径是

    • C:\Program Files\Microsoft Office\root\Office16\Outlook.exe

    但是,您需要考虑到用户可能安装了较旧的(例如,Office 15,又名 Office 2013)或较新的 Office 版本,并选择适当的注册表项。也可以通过检索默认值来获取Office版本

    • HKEY_CLASSES_ROOT\Outlook.Application\CurVer

    键(例如,Outlook.Application.16)。从中,您可以推断版本号(例如,16)并构建您的注册表项的段(例如,16.0)。或者您可以尝试使用具有Path 值的子键Outlook\InstallRoot 查找键。无论如何,您可能会明白我为什么要避免这种情况。

    让我们看一个更简单的解决方案,注意我正在使用多个 Office 应用程序,因此有以下 using 指令:

    using Outlook = Microsoft.Office.Interop.Outlook;
    

    为了让 Outlook 在当前没有可见窗口时显示其主窗口,我编写了以下实用方法:

    private static void EnsureOutlookIsVisible(Outlook.Application outlook)
    {
        object window = null;
        NameSpace ns = null;
        MAPIFolder folder = null;
    
        try
        {
            // Check whether Outlook has an active window. If so, Outlook is visible
            // and we don't have to do anything.
            window = outlook.ActiveWindow();
            if (window != null) return;
    
            // No active window is shown, so Outlook is not visible and we need to
            // have Outlook display a window.
            ns = outlook.GetNamespace("MAPI");
            folder = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
            folder.Display();
        }
        finally
        {
            folder.ReleaseComObject();
            ns.ReleaseComObject();
            window.ReleaseComObject();
        }
    }
    

    上述方法使用如下扩展方法来释放COM对象:

    public static void ReleaseComObject<T>(this T resource) where T : class
    {
        if (resource != null && Marshal.IsComObject(resource))
        {
            Marshal.ReleaseComObject(resource);
        }
    }
    

    使用上述方法,要附加到新的或现有的 Outlook 进程并确保 Outlook 显示其主窗口,您只需要以下两行代码:

    var outlook = new Outlook.Application();
    EnsureOutlookIsVisible(outlook);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多