Исходящее почтовое сообщение Outlook свернуто во время модального события ShowDialog () (VSTO) - PullRequest
0 голосов
/ 25 января 2019

Мы унаследовали некоторый код для надстройки Outlook VSTO, который вызывает модальное диалоговое окно, вроде подтверждения конечного пользователя перед отправкой электронного письма.

Диалог запускается при событии Application_ItemSend

Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend

Проблема, с которой мы сталкиваемся, заключается в том, что при отображении диалогового окна:

objCheckDialog.ShowDialog()

Окно исходящей электронной почты сворачивается, когда всплывающее диалоговое окно нежелательнои использование .Show () также нежелательно.

Во время нашего исследования мы наблюдали некоторые проблемы, в которых предлагалось исследовать родительские свойства нашего объекта диалога, однако мы не видим доступных родительских свойств, которыепозволит нам максимизировать родителя:

enter image description here

Еще одно предложение состояло в том, чтобы передать ShowDialog () ссылку на Надстройку, чтобы указать владельцадиалоговое окно, IE:

objCheckDialog.ShowDialog(Me)

Так как это свойство также Nothing, но считалось, что оно может заполнить Parent:

enter image description here

Однако этовыдает следующее исключение:

{"Unable to cast object of type 'XYZ.ThisAddIn' to type 'System.Windows.Forms.IWin32Window'."}

Есть идеи о том, что мы делаем неправильно?

Спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Вам потребуется использовать класс NativeWindow.

objCheckDialog.ShowInTaskbar = false;
IntPtr wnd = ParentWindow();
if (wnd != IntPtr.Zero)
{
    NativeWindow nativeWindow = new NativeWindow();
    nativeWindow.AssignHandle(wnd);
    return objCheckDialog.ShowDialog(nativeWindow);
}
else
{
    return form.ShowDialog();
}

Дескриптор родительского окна можно получить из объекта Explorer или Inspector с использованием интерфейса IOleWindow:

[ComImport]
[Guid("00000114-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleWindow
{
    void GetWindow(out IntPtr phwnd);
    void ContextSensitiveHelp([In, MarshalAs(UnmanagedType.Bool)] bool fEnterMode);
}

public IntPtr ParentWindow()
{
    IntPtr wnd = new IntPtr(0);
    object window = _application.ActiveWindow();
    if (window != null)
    {
         IOleWindow oleWindow = window as IOleWindow;
         if (oleWindow != null)
         {
             oleWindow.GetWindow(out wnd);
         }
    }
    return wnd;
}
...