首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COM Interop & Outlook -使Outlook可见?

COM Interop & Outlook -使Outlook可见?
EN

Stack Overflow用户
提问于 2010-05-27 00:07:46
回答 3查看 2.9K关注 0票数 3

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

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

代码语言:javascript
复制
OutlookApp.Visible = True

OutlookApp.Application.Visible = True

OutlookApp.ActiveWindow.Visible = True

OutlookApp.ActiveExplorer.Display() 

但它们都不起作用。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-27 00:55:22

我通常会先测试"Outlook“进程是否在运行,如果不是,则先执行Outlook.exe,然后再执行连接。这样你就永远不会得到一个隐藏的进程。

真的没有办法取消关闭outlook,你可以挂起应用程序的退出事件来断开连接并在你的应用程序中进行处理。

票数 2
EN

Stack Overflow用户

发布于 2013-07-04 16:14:52

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

代码语言:javascript
复制
mailItem.Display();

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

票数 4
EN

Stack Overflow用户

发布于 2020-03-02 02:00:56

我刚才遇到了这个问题,因为我也遇到了同样的挑战。我对这个公认的答案并不完全满意,因为这意味着我必须确定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指令:

代码语言:javascript
复制
using Outlook = Microsoft.Office.Interop.Outlook;

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

代码语言:javascript
复制
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对象:

代码语言:javascript
复制
public static void ReleaseComObject<T>(this T resource) where T : class
{
    if (resource != null && Marshal.IsComObject(resource))
    {
        Marshal.ReleaseComObject(resource);
    }
}

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

代码语言:javascript
复制
var outlook = new Outlook.Application();
EnsureOutlookIsVisible(outlook);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2914718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档