如何确定 Outlook 应用程序已完全加载(application.StartUp 事件)

How to be sure Outlook application has been loaded completely (application.StartUp event)

我的 C# 应用程序需要在 Outlook 附近工作。我已经实现了一种允许加载 Outlook(如果尚未打开)的方法。使用这种加载方法后,我需要开始处理电子邮件、阅读收件箱文件夹等。 .显然,所有这些行为都必须在 Outlook 打开时执行,特别是如果主 Outlook windows 已准备就绪。

查看 OOM 我找到了应用程序 Startup 事件,我想我可以用它来确保应用程序准备就绪...但我不知道如何使用它。

为了分享我正在尝试做的事情的想法,这里有代码(简化):

主要:

 OutlookProvider p= new OutlookProvider();
 p.Connect();
 if(p.AppIsOn) {
  // TO DO: start working
 }
 else
    throw new Exception("Error; Unable to connect to Outlook.");

OutlookProvider class:

 #region Fields
   Outlook.Application oApp;
   Outlook.MailItem oMail;
   bool AppIsOn;
 #endregion

 OutlookProvider() { AppIsOn= false; }

 Connect() {
   try {
     // try to connect to the possible running Outlook instance
     oApp = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
     AppIsOn= true;
   }
   catch(Exception exc) {
    // Outlook is not running, so I create my own Outlook instance

    // here my app is null so an Exception will be thrown
    oApp.Startup += new Outlook.ApplicationEvents_11_StartupEventHandler(SetAppIsOn);
    oApp= (Outlook.Application)new Outlook.Application();
   }
  }

  void SetAppIsOn() { AppIsOn= true;}

我可以使用那个事件来解决我的问题吗?如果是,我如何实现 Connect() 方法以设置我的布尔 AppIsOn 变量?

首先,您需要创建对象的实例,然后才尝试订阅事件。当对象为 null(尚未初始化)时,您无法设置事件处理程序。因此,代码应如下所示:

oApp= (Outlook.Application)new Outlook.Application();
oApp.Startup += new Outlook.ApplicationEvents_11_StartupEventHandler(SetAppIsOn);

无论如何,如果您自动化主机应用程序,则无需处理 Startup 事件。查看 C# app automates Outlook (CSAutomateOutlook) 示例应用程序,它解释了如何从 C# 自动化 Outlook。 Outlook 对象模型不是异步的,因此每个方法或 属性 将根据需要花费尽可能多的时间。

P.S。没有初始化 Outlook 的方法。当 Outlook 尚未 运行 时,Logon 方法仅用于登录到特定的配置文件。如果 Outlook 不是 运行 并且您只想使用默认配置文件启动 Outlook,请不要使用登录方法。

为确保 Outlook 已完全初始化,请致电 Namespace.Logon。如果 Outlook 已经 运行,调用将不执行任何操作。

也没有理由调用 GetActiveObject - Outlook 是单例,因此如果 Outlook 已经 运行,则创建新对象将 return 现有对象。

olApp = new Outlook.Application();
Outlook.Namespace ns = olApp.GetNamespace("MAPI");
ns.Logon();