visual studio servicio instalar instalador form crear c# winforms installer windows-installer custom-action

instalador - instalar servicio windows c# visual studio 2017



Instalador personalizado en.Net que muestra el formulario detrĂ¡s del instalador (10)

[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(); } }

Necesito mostrar el archivo topmost delante de la interfaz de usuario predeterminada de Windows Installer. Lo anterior es código de muestra dentro de mi CustomAction que estoy usando para crear un Formulario. Establecer la propiedad TopMost o usar ShowDialog no ayuda. ¿Hay alguna otra solución para hacer que mi forma sea la más alta y enfocada?


Aunque no estoy seguro de qué es exactamente lo que está pidiendo, usar WiX para crear instaladores de Windows es el camino preferido. Allí puede construir sus formularios y acciones personalizadas y casi cualquier otra cosa.


Si desea tener control completo sobre la interfaz de usuario del instalador para la creación de marca o diálogos personalizados y no desea usar el software de instalación del instalador como InstallShield, puede crear una aplicación C ++ para servir como shell para Windows Installer. No es necesario implementar el instalador acciones como copiar archivos usted mismo.

Windows Installer tiene API para tal fin. Con la función MsiSetExternalUIRecord, puede proporcionar una devolución de llamada para capturar notificaciones del instalador, como mensajes y actualizaciones de progreso.


Los cuadros de diálogo creados por acciones personalizadas siempre se muestran detrás de los cuadros de diálogo de instalación en las versiones más nuevas de Windows (Vista y Windows 7). Esto se debe a que Windows impide que las aplicaciones muevan una ventana sobre todas las demás ventanas. Piensa en cómo las ventanas emergentes de virus llenarían la pantalla en versiones anteriores de Windows.

En su lugar, se muestra un cuadro de diálogo recién creado en el fondo y su botón de barra de título (si tiene uno) parpadea.

La solución correcta para lo que desea es crear un diálogo en su paquete MSI y usarlo en lugar de la acción personalizada.


La mayoría no funcionará. Simplemente haga que el formulario se muestre en la acción personalizada más grande que el formulario del instalador MSI.



Intenté lo mismo y puedo ver el formulario. Lo único diferente que puedo ver es que te falta base.OnAfterInstall (savedState); en tu código

Y si aún no aparece intente poner solo MessageBox para ver si su instalador está enganchado o no con el proyecto de instalación

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); }


Si desea mostrar su propia IU en el instalador, no podrá usar un proyecto de instalación y despliegue, ya que carece de las funciones necesarias para implementarlo. Considere usar un kit de herramientas de instalador como WiX o Inno Setup en su lugar.

Con respecto a la primera parte de su pregunta, ¿está pasando el cuadro de diálogo personalizado en el argumento owner a MessageBox.Show () ?


Llame a Minimize y Restore / show methods del formulario, esto soluciona su problema.


Llame a this.focus() en su form.OnLoad . Método de form.OnLoad . Eso lo hace aparecer frente al instalador. Solución simple


Puede usar la opción de formulario TopMost y el método de enfoque. Pero hay una manera mucho mejor. Puede obtener el proceso del instalador, luego obtenerlo y luego usarlo como parámetro en el método 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 es algo como esto:

public class WindowWrapper : IWin32Window { private readonly IntPtr hwnd; public IntPtr Handle { get { return hwnd; } } public WindowWrapper(IntPtr handle) { hwnd = handle; } }