3

我正在从 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 显示其主窗口?如果我可以让它禁止用户关闭实例,那么我会加分,但我会满足于只显示窗口:)

4

3 回答 3

4

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

mailItem.Display();

它是 c# 代码,但我认为,这与你的 vb 很接近。

于 2013-07-04T08:14:52.097 回答
2

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

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

于 2010-05-26T16:55:22.080 回答
1

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

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

  • 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)。或者您可以尝试使用Outlook\InstallRoot具有Path值的子键来查找键。无论如何,您可能会明白我为什么要避免这种情况。

因此,让我们看一个更简单的解决方案,注意我正在使用多个 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);
于 2020-03-01T18:00:55.530 回答