Не удается получить приложение Outlook.Application во время работы Outlook, пока окно, не относящееся к Outlook, находится на переднем плане - PullRequest
0 голосов
/ 08 февраля 2019

Marshal.GetActiveObject("Outlook.Application") выдает Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)), когда Outlook запускается и продолжает работать, пока он не работает, пока окно, не относящееся к Outlook, не станет активным окном переднего плана.

Я использую версию Outlook 1901 Build 11231.20130 в версии Windows 101803 Build 17134.523 (это моя локальная машина).Я наблюдал за клиентскими машинами, которые не ведут себя таким образом.Это происходит в приложении WPF с использованием .NET 4.5.2 и Microsoft.Office.Interop.Outlook version 15.0.4797.1003, полученных через NuGet.

Я неоднократно запускал следующий код.Как подробно описано выше, он будет успешным после того, как экземпляр Outlook будет свернут или если окно, не относящееся к Outlook, установлено на передний план, но оно может постоянно отказывать (вывод ниже), прежде чем это произойдет.Я пытался сделать паузу на ~ 20-30 секунд, чтобы дать Outlook время для загрузки, но все равно получаю тот же результат.

    // Detect that the active window is an Outlook window
    Outlook.Application app = null;
    // Optional: Wait for Outlook to load 20-30 sec using Thread.Sleep
    try
    {
        Debug.WriteLine("app");
        app = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
        Debug.WriteLine("got app");
    }
    catch (Exception exception)
    {
        Debug.WriteLine(exception.Message);
    }
    // Do things with app

Пока Outlook работает, я ожидаю увидеть:

app
got app

, который возникает, если окно, не относящееся к Outlook, установлено на передний план (т. Е. Не окно обозревателя или инспектора) с момента запуска Outlook.Если Outlook работает и всегда был на переднем плане, я вместо этого вижу:

app
Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))

Как выстрел в темноте, я попытался «загрузить» Interop, выполнив следующие действия, когда я заметил этопроисходит:

bootApplication = new Microsoft.Office.Interop.Outlook.Application();

Без эффекта.Любой вклад будет оценен.Спасибо!

1 Ответ

0 голосов
/ 08 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...