2016-12-05 6 views
2

Мы используем область эксплойтов, которая загружается с правой стороны Outlook. В этой области формы у нас есть один пользовательский элемент управления, MyContainer. Это, в свою очередь, содержит два элемента управления.Как надежно узнать, какой объект находится в текущем (в фокусе) окне перспективы. то есть тип проводника или инспектор типа

В MyContainer нам необходимо определить видимость каждого дочернего элемента управления.

Метод, содержащий ActiveInspector и ActiveExplorer, не является надежным.

Пример

Открытие более одного окна ввода в главном окне проводника, я случайно переключаться между представлениями Explorer, которые; Отправлено, Исходящие и т. Д. Я все еще нахожу объекты проводника и инспектора.

Мне нужен хороший способ гарантировать, что окно, в котором загружается мой регион или элемент управления MyContainer, является составом/чтением или основным проводником (Inbox/Sent/Drafts/Outbox).

Я пробовал несколько вещей, но безуспешно.

Любые указатели или предложения будут действительно полезными.

ответ

3

Попробуйте Application.ActiveWindow (это может быть Explorer или Inspector).

2

Простой, если/else условие может выполнить эту работу.

Основная проблема заключается в том, что используется встроенный отклик Outlook.

Это доступно с версии 13. Таким образом, мы используем пустую попытку/улов, чтобы справиться с этим.

  Outlook.MailItem Email = null; 
      Outlook.Inspector actInspector = Outlook.Application.ActiveInspector(); 
      if (actInspector == null) 
      { 
       Outlook.Explorer explorer = Outlook.Application.ActiveExplorer(); 

       try 
       { 
        Email = explorer.GetType().InvokeMember("ActiveInlineResponse", System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Instance | 
          System.Reflection.BindingFlags.Public, null, explorer, null) as Outlook.MailItem; 
       } 
       finally 
       { 
        Marshal.ReleaseComObject(explorer); 
       } 
      } 
      else 
      { 
       try 
       { 
        Email = actInspector.CurrentItem as Outlook.MailItem; 
       } 
       finally 
       { 
        if (actInspector != null) Marshal.ReleaseComObject(actInspector); 
       } 
      }