Win форма не открывается после развертывания Outlook VSTO Addin? - PullRequest
0 голосов
/ 04 мая 2020

Я развернул надстройку Outlook с помощью проекта установщика Visual Studio (по ссылке по этой ссылке) с C#.

. Установка корректно устанавливается (.msi), и я Я могу видеть его внутри Параметры -> Надстройка, также видна лента с элементами управления. (Это winform)

К сожалению, , когда я нажимаю кнопку (внутри ленты), ничего не происходит .

Код в Ribbon.cs:

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    Form1 formObj = new Form1();

    formObj.FormBorderStyle = FormBorderStyle.FixedDialog;

    formObj.MaximizeBox = false;

    formObj.MinimizeBox = false;

    formObj.StartPosition = FormStartPosition.CenterScreen;

    //formObj.ShowDialog();
    formObj.Show();
}

Код работает нормально при отладке решения.

Я искал, но не нашел ничего связанного. В чем может быть проблема здесь, или я что-то упускаю?

С уважением, Ank

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Я получил эту проблему здесь.

На самом деле у меня есть зависимость для формы win (Materialskin.dll), которая была исключена из обнаруженных зависимостей (внутри проекта установки), как упомянуто в руководстве.

Я изменил значение свойства exclude на false только для Materialskin.dll и перестроил решение.

После успешной установки созданного MSI-пакета надстройка работает нормально.

0 голосов
/ 04 мая 2020

Скорее всего, ваша форма отображается за окном Outlook. Чтобы отобразить его поверх Outlook windows, необходимо указать дескриптор родительского окна. Вы можете получить его, приведя экземпляр окна Outlook, такой как Explorer или Inspector, к интерфейсу IOLEWindow и используя метод IOleWindow :: GetWindow , который извлекает дескриптор одного из windows, участвующих в активации на месте ( фрейм, документ, родитель или окно объекта на месте).

Метод Show или ShowDialog принимает экземпляр интерфейса IWin32Window , который представляет дескриптор родительского окна.

 /// <summary>
 /// Implemented and used by containers and objects to obtain window handles 
 /// and manage context-sensitive help.
 /// </summary>
 /// <remarks>
 /// The IOleWindow interface provides methods that allow an application to obtain  
 /// the handle to the various windows that participate in in-place activation, 
 /// and also to enter and exit context-sensitive help mode.
 /// </remarks>
 [ComImport]
 [Guid("00000114-0000-0000-C000-000000000046")]
 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
 public interface IOleWindow
 {
     /// <summary>
     /// Returns the window handle to one of the windows participating in in-place activation 
     /// (frame, document, parent, or in-place object window).
     /// </summary>
     /// <param name="phwnd">Pointer to where to return the window handle.</param>
     void GetWindow (out IntPtr phwnd) ;

     /// <summary>
     /// Determines whether context-sensitive help mode should be entered during an 
     /// in-place activation session.
     /// </summary>
     /// <param name="fEnterMode"><c>true</c> if help mode should be entered; 
     /// <c>false</c> if it should be exited.</param>
     void ContextSensitiveHelp ([In, MarshalAs(UnmanagedType.Bool)] bool fEnterMode) ;
 }

 public IWin32Window  getWindowHandle()
 {
        dynamic activeWindow = Globals.ThisAddIn.Application.ActiveWindow();
        IOleWindow win = activeWindow as IOleWindow;
        window = win.GetWindow();        
        IWin32Window wind = Control.FromHandle(window);

        return wind;
 }

// and pass it to the Show method

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