#outlook #vsto #outlook-addin
Вопрос:
Я работаю над плагинами Outlook VSTO для отображения сообщения поверх текущего открытого окна. Например, я хочу отобразить сообщение пользователю при попытке «Ответить всем» при определенных условиях. По электронной почте это работает нормально, но то же самое не работает при встрече.
Письмо по делу — (Ответ, Ответить всем, Новое)
Он работает нормально, как показано ниже.
'Starup Event to initialize control objects
Private Sub ThisAddIn_Startup() Handles Me.Startup
Try
'Insitialize outlook inspector.
inspectors = Globals.ThisAddIn.Application.Inspectors
'Create new inspector
AddHandler inspectors.NewInspector, AddressOf inspectors_NewInspector
Catch ex As System.Exception
'MessageBox.Show(ex.StackTrace)
End Try
End Sub
Sub inspectors_NewInspector(inspector As Microsoft.Office.Interop.Outlook.Inspector)
Try
subInspector = inspector
Dim mailItem As Outlook.MailItem
mailItem = DirectCast(inspector.CurrentItem, Outlook.MailItem)
'AddHandler mailItem.Open, AddressOf explorer_onOpen
Catch ex As System.Exception
End Try
End Sub
Private Sub explorer_onOpen()
'I am using Thread to wait few seconds until New Email Windows open.
'Else message message bar display on the windows which opened and on top. and
' New/Reply email windows takes some time to appear.
Dim thread As New Thread(AddressOf MyBackgroundThread)
thread.IsBackground = True
thread.Start()
End Sub
Private Sub MyBackgroundThread()
Try
'Pause code for 2.5 seconds
Thread.Sleep(2500)
MessageBox.Show("Threading")
_obj = New UserControl2
Dim _pane1 = Globals.ThisAddIn.CustomTaskPanes.Add(_obj,"Test",Globals.ThisAddIn.Application.ActiveWindow)
_pane1.Visible=True
Catch ex As System.Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Но тот же код не работает при назначении. Код выглядит следующим образом. Только изменения, которые я внес в Открытое событие и поток
Sub inspectors_NewInspector(inspector As Microsoft.Office.Interop.Outlook.Inspector)
Try
subInspector = inspector
Dim appouitmentItem As Outlook.AppointmentItem
appouitmentItem = DirectCast(inspector.CurrentItem, Outlook.AppointmentItem)
AddHandler appouitmentItem.Open, AddressOf explorer_onOpen
Catch ex As System.Exception
End Try
End Sub
Private Sub explorer_onOpen()
'Thread to display warning message after few seconds
MessageBox.Show("Thread to display warning message after few seconds")
Dim thread As New Thread(AddressOf MyBackgroundThread)
thread.IsBackground = True
thread.Start()
End Sub
Private Sub MyBackgroundThread()
Try
'Pause code for 2.5 seconds
Thread.Sleep(2500)
MessageBox.Show("Threading")
_obj = New UserControl2
Dim _pane1 = Globals.ThisAddIn.CustomTaskPanes.Add(_obj,"Test",Globals.ThisAddIn.Application.ActiveWindow)
_pane1.Visible=True
Catch ex As System.Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Я получаю ошибку
«Невозможно привести систему типа объекта COM»._ComObject’ для типа интерфейса ‘Microsoft.VisualStudio.Инструменты.Офис.Время выполнения.ICustomTaskPaneSite». Эта операция не удалась, поскольку вызов QueryInterface для компонента COM для интерфейса itnterface с IID{} не удался из-за следующей ошибки: Такой интерфейс не поддерживается.
Среда: Visual Studio 2019 Office 2016
Ответ №1:
Прежде всего, в Outlook нет необходимости использовать панели задач для окон инспектора. Вместо этого вы можете рассмотреть возможность использования областей форм Outlook. Области форм предлагают множество улучшений по сравнению с разработкой традиционных форм Outlook:
- Настройте страницу по умолчанию для любой стандартной формы.
- Добавьте до 12 дополнительных страниц в любую стандартную форму.
- Замените или улучшите любую стандартную форму.
- Отображение пользовательского интерфейса в области чтения и в Инспекторах.
Дополнительные сведения см. в разделе Настройка страниц форм и областей форм.
Обработчик FormRegionInitializing
событий отображается в файле кода области формы. Вы можете использовать этот обработчик событий, чтобы указать, должен ли Outlook отображать область формы. Дополнительные сведения см. в разделе Обработка событий области формы.
Кроме того, вам необходимо запустить код из основного потока (потока пользовательского интерфейса), поскольку Outlook использует однопоточную модель квартиры. Кроме того, любые изменения пользовательского интерфейса должны вноситься из основного потока.
Комментарии:
1. Привет, FormRegion не дает мне возможности отображать сообщение сверху. Область формы отображается только внизу. Так что это не соответствует моим требованиям. В то время как CustomTaskPanes работает в электронной почте в потоке, в то время как он не работает на собрании в потоке. Внешняя резьба работает нормально