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

时间:2015-06-10 10:30:12

标签: c# outlook

我的C#应用​​程序需要在Outlook附近工作。我已经实现了一个允许加载Outlook的方法,如果它还没有开启。在这种加载方法之后,我需要开始处理电子邮件,阅读收件箱文件夹等。 。显然,当Outlook打开时,必须执行所有这些行为,特别是如果主Outlook窗口准备就绪。

查看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类:

 #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变量?

2 个答案:

答案 0 :(得分:1)

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

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。 Logon方法仅用于在Outlook尚未运行时登录到特定的配置文件。如果Outlook未运行且您只想使用默认配置文件启动Outlook,请不要使用登录方法。

答案 1 :(得分:0)

要确保Outlook已完全初始化,请调用Namespace.Logon。如果Outlook已在运行,则呼叫将不执行任何操作。

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

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