如何确保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
变量?
首先,您需要创建对象的实例,然后才尝试订阅事件。当对象为空(尚未初始化)时,不能设置事件处理程序。因此,代码应该像下面这样:
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();