Пользовательский установщик в .Net показывает форму за установщиком - PullRequest
7 голосов
/ 02 июня 2011
[RunInstaller(true)]
public partial class Installer1 : Installer
{
    public Installer1()
    {
        InitializeComponent();
    }

    public override void Install(System.Collections.IDictionary stateSaver)
    {
        base.Install(stateSaver);
    }
    private void Installer1_AfterInstall(object sender, InstallEventArgs e)
    {
        Form1 topmostForm = new Form1();
        topmostForm.BringToFront();
        topmostForm.TopMost = true;            
        topmostForm.ShowDialog();
  } }

Мне нужно отобразить topmostForm перед пользовательским интерфейсом установщика Windows по умолчанию. Выше приведен пример кода внутри моего CustomAction, который я использую для создания формы. Установка свойства TopMost или использование ShowDialog не помогает. Есть ли какое-нибудь другое решение, чтобы сделать мою форму самой лучшей и сфокусированной?

Ответы [ 10 ]

3 голосов
/ 02 июня 2011

Если вы хотите показать свой собственный пользовательский интерфейс в программе установки, вы не сможете использовать проект установки и развертывания, поскольку в нем отсутствуют функции, необходимые для его реализации. Попробуйте вместо этого использовать набор инструментов для установки, например WiX или Inno Setup .

Что касается первой части вашего вопроса, передаете ли вы настраиваемое диалоговое окно в аргументе owner MessageBox.Show () ?

2 голосов
/ 31 декабря 2011

Топ самый не будет работать.Просто сделайте форму, которая будет отображаться в настраиваемом действии, больше, чем форма установщика MSI.

2 голосов
/ 04 июня 2011

Диалоги, созданные с помощью пользовательских действий, всегда отображаются за диалоговыми окнами установки в новых версиях Windows (Vista и Windows 7).Это связано с тем, что Windows не позволяет приложениям перемещать окно поверх всех других окон.Подумайте, как вирусные всплывающие окна будут заполнять экран в старых версиях Windows.

Вместо этого на заднем плане отображается только что созданное диалоговое окно, а кнопка его строки заголовка (если она есть) мигает.

Правильное решение для того, что вы хотите, это создать диалог в вашем пакете MSI и использовать его вместо пользовательского действия.

2 голосов
/ 02 июня 2011

Если вы хотите иметь полный контроль над пользовательским интерфейсом установщика для брендинга или пользовательских диалогов и не хотите использовать программное обеспечение установщика, такое как InstallShield, то вы можете создать приложение C ++ в качестве оболочки для установщика Windows - в этом нет необходимости. для выполнения действий установщика, таких как копирование файлов самостоятельно.

Установщик Windows имеет API для этой цели. С помощью функции MsiSetExternalUIRecord вы можете обеспечить обратный вызов для захвата уведомлений установщика, таких как сообщения и сообщения о ходе выполнения.

2 голосов
/ 02 июня 2011

, хотя я не уверен, что именно вы запрашиваете, использование WiX для сборки Windows - это предпочтительный способ. Там вы можете создавать свои формы, настраиваемые действия и многое другое.

1 голос
/ 23 января 2017

Вы можете использовать опцию формы TopMost и метод Focus. Но есть намного лучший способ. Вы можете получить процесс установки, затем обработчик окна и использовать его в качестве параметра в методе ShowDialog ::

var proc = Process.GetProcessesByName("msiexec").FirstOrDefault(p => p.MainWindowTitle == "Name of product");
var formResult = proc != null
  ? form.ShowDialog(new WindowWrapper(proc.MainWindowHandle))
  : form.ShowDialog();

WindowWrapper выглядит примерно так:

public class WindowWrapper : IWin32Window
{
  private readonly IntPtr hwnd;
  public IntPtr Handle {
    get { return hwnd; }
  }
  public WindowWrapper(IntPtr handle) {
    hwnd = handle;
  }
}
1 голос
/ 24 января 2013

Я попробовал то же самое, и я вижу форму.Единственное отличие, которое я вижу, это то, что вам не хватает base.OnAfterInstall (saveState);в вашем коде.

И если он по-прежнему не отображается, попробуйте установить MessageBox, чтобы увидеть, подключен ли ваш установщик с проектом установки

    protected override void OnAfterInstall(IDictionary savedState)
    {
        // message box to test
        MessageBox.Show("test");
        Verify topmostForm = new Verify();
        topmostForm.BringToFront();
        topmostForm.TopMost = true;
        topmostForm.ShowDialog();

      //this line is missing in your code

       base.OnAfterInstall(savedState);
    }
1 голос
/ 09 августа 2012
0 голосов
/ 19 августа 2016

Позвоните this.focus() по вашему form.OnLoad методу. Это заставляет его показываться перед установщиком. Простое исправление.

0 голосов
/ 21 октября 2014

Вызовите свернуть и восстановить / показать методы формы, это решит вашу проблему.

...