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

本文关键字:应用程序 启动 事件 加载 Outlook 何确保 确保 | 更新日期: 2023-09-27 17:55:01

我的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变量?

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

首先,您需要创建对象的实例,然后才尝试订阅事件。当对象为空(尚未初始化)时,不能设置事件处理程序。因此,代码应该像下面这样:

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

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

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

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

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

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