MessageBox.Show не является модальным в проекте установки - PullRequest
2 голосов
/ 07 марта 2011

У меня есть проект установки VS2010, и одно из пользовательских действий по удалению показывает уведомления с использованием метода MessageBox.Show, но иногда они появляются за окном мастера установки, что совершенно неприемлемо. Есть ли способ показать их поверх мастера, возможно, сделать их модальными? Или я должен создать собственные окна, если невозможно показывать окна сообщений всегда сверху или модально? Я не указываю никаких владельцев в методе messagebox.show. Настраиваемое действие вызывает метод класса внутри dll, а не exe-файла. Я попытался найти процесс с именем «msiexec» и mainwindowtitle == заголовок окна моего мастера проекта установки, но в случае удаления оба процесса просто не имеют заголовков и дескрипторов окна, хотя окно удаления отображается!

Ответы [ 4 ]

2 голосов
/ 09 марта 2011

Мне следует использовать MessageBoxOptions.DefaultDesktopOnly в методе MessageBox.Show.

0 голосов
/ 08 ноября 2013

Это работает при установке или удалении в Windows XP и 7, если у вас есть только один процесс установки:

        NativeWindow nativeWnd = new NativeWindow();
        try
        {
            IntPtr hWnd = (from p in Process.GetProcessesByName("msiexec") where p.MainWindowHandle != IntPtr.Zero select p.MainWindowHandle).SingleOrDefault();
            if (hWnd == IntPtr.Zero)
                MessageBox.Show(message, title, buttons, icon, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
            else
            {
                nativeWnd.AssignHandle(hWnd);
                MessageBox.Show(nativeWnd, message, title, buttons, icon);
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception thrown in ShowModalDlg", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
        }
        finally { nativeWnd.ReleaseHandle(); }
0 голосов
/ 30 ноября 2012

Похоже, что во время удаления (и восстановления) установка запускается с помощью explorer.exe вместо msiexec.exe. Поэтому в предложенном решении здесь попробуйте поискать окно настройки в процессе "explorer", если оно не найдено в "msiexec". Обратите внимание, что в отличие от msiexec, в случае проводника окно настройки не является основным окном. Поэтому вам потребуется p / invoke EnumWindows и GetWindowThreadProcessId , чтобы получить окно.

0 голосов
/ 07 марта 2011

Вы можете создать унаследованную форму (Добавить новую форму Windows -> Унаследованная форма) или извлеките второй конструктор (IWin32Window) MessageBox и назначьте свойство владельца. Отображает окно сообщения перед указанным объектом.

...