2015-02-13 4 views
0

Я пытаюсь создать контекстное меню для гиперссылки. Кажется, есть несколько контекстов, где события гиперссылки могут быть перехвачены - на данный момент меня интересует контекстное меню с idMso = «ContextMenuReadOnlyMailHyperlink».Контекстное меню гиперссылки Outlook

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

При вызове из области предварительного просмотра мой обратный вызов получает объект COM проводника. Я предположил, что свойство ActiveInlineResponseWordEditor проводника будет содержать мою выбранную гиперссылку каким-то образом, но это вызывает ненужное исключение COM («Не удалось выполнить операцию»).

Как найти выбранную гиперссылку из этого контекста?

Кроме того, как насчет объекта COM Inspector (когда гиперссылка нажата правой кнопкой мыши по электронной почте в ее собственном окне)?

ответ

1

Я предположил, что свойство ActiveInlineResponseWordEditor проводника будет содержать мою выбранную гиперссылку каким-либо образом, но это вызывает нежелательное исключение COM («Не удалось выполнить операцию»).

Свойство ActiveInlineResponseWordEditor не может быть использовано, если InlineResponse не активирован. Событие класса InlineResponse класса Explorer запускается, когда пользователь выполняет действие, которое приводит к появлению встроенного ответа в области чтения. В вашем случае встроенный ответ не активируется.

Как найти выбранную гиперссылку из этого контекста?

Класс проводника предоставляет свойство Selection, которое возвращает объект Selection, который содержит элемент или элементы, выбранные в окне проводника. Вы можете использовать метод Item (представленный индексом в C#), чтобы получить элемент Microsoft Outlook или заголовок беседы из выделения. Затем попробуйте применить его к классу MailItem и получить объект Inspector, см. Метод GetInspector класса MailItem. Класс Inspector предоставляет свойство WordEditor, которое возвращает объектную модель документа Microsoft Word отображаемого сообщения. Вы можете использовать объектную модель Word для выбора.

+0

Хорошо, если письмо содержит несколько гиперссылок, где я могу найти который один был щелкнут правой кнопкой мыши? –

+0

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

+0

Yikes. Хорошо, спасибо. –

1

У меня была аналогичная проблема, и мое решение выглядело так:

public void OnCustomHyperlinkMenuClick(IRibbonControl control) 
{ 
    Explorer explorer = control.Context as Explorer; 
    if (explorer != null) 
    { 
     Document document = explorer.ActiveInlineResponseWordEditor; 
     //Note from asker: above line throws a COM Exception ("The operation failed") 

     if (document != null && document.Windows != null && document.Windows.Count > 0) 
     { 
      Microsoft.Office.Interop.Word.Selection selection = document.Windows[1].Selection; 
      if (selection != null && selection.Hyperlinks != null && selection.Hyperlinks.Count > 0) 
      { 
       Hyperlink hyperlink = selection.Hyperlinks[1]; 
       string hyperlinkUrl = hyperlink.Address; 
       DoSomethingWithUrl(hyperlinkUrl); 
      } 
     } 
    } 
} 

Вам нужно будет добавить ссылку на слово сборки взаимодействия «Microsoft.Office.Interop.Word.dll» к вашему проекту.

+0

Примечание это в моем оригинальный вопрос: Я предположил, свойство ActiveInlineResponseWordEditor Проводника будет содержать выбранный мою гиперссылку как-то, но он бросает, не полезный COM исключение –