我的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
变量?
答案 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();