2015-06-10 2 views
0

Мое приложение C# должно работать с Outlook. Я реализовал метод, который позволяет загрузить Outlook, если он еще не включен. После этого метода загрузки мне нужно начать работу с электронной почтой, прочитать папку «Входящие» и т. Д. , очевидно, что все эти поведения должны выполняться, когда Outlook включен, в частности, если основные окна Outlook готовы.Как быть уверенным, что приложение Outlook полностью загружено (событие application.StartUp)

Глядя на 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(), чтобы установить переменную boolean AppIsOn?

ответ

0

Чтобы убедиться, что Outlook полностью инициализирован, вызовите Namespace.Logon. Если Outlook уже запущен, вызов ничего не сделает.

Также нет причин для вызова GetActiveObject - Outlook является одноэлементным, поэтому создание нового объекта будет возвращать существующий объект, если Outlook уже запущен.

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

Благодарим за ответ. 'GetActiveObject()' была моей проблемой ... во второй раз, когда я пытался подключиться к существующему экземпляру outlook, он выбрал исключение («Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)»). Я решаю свою проблему, изменяя ее с помощью Activator.CreateInstance (Type.GetTypeFromProgID («Outlook.Application»)) как Microsoft.Office.Interop.Outlook.Application; '. Очень интересно, что [здесь] (https://msdn.microsoft.com/en-us/library/office/ff462097.aspx) MS предлагает использовать GetActiveObject(). – baru

+0

Метод Logon используется только для входа в определенный профиль, когда Outlook еще не запущен, а не для его инициализации. Нет способа инициализации Outlook. –

+0

Если вы не знаете, что Outlook уже запущен, вы всегда можете вызвать Logon - он войдет в систему, если Outlook еще не запущен и ничего не делает, если это так. –

1

Прежде всего, вам нужно создать экземпляр объекта и только затем попытаться подписаться на события. Вы не можете настроить обработчик событий, когда объект имеет значение null (еще не инициализировано). Таким образом, код должен выглядеть следующим образом одно:

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

Во всяком случае, нет необходимости обрабатывать событие запуска, если вы автоматизации хост-приложения. Взгляните на пример приложения C# app automates Outlook (CSAutomateOutlook), в котором объясняется, как автоматизировать Outlook с C#. Объектная модель Outlook не является асинхронной, поэтому каждый метод или свойство займет столько времени, сколько потребуется.

P.S. Не существует способа инициализации Outlook. Метод Logon используется только для входа в определенный профиль, когда Outlook еще не запущен. Если Outlook не запущен, и вы хотите запустить Outlook только с профилем по умолчанию, не используйте метод входа в систему.

Смежные вопросы