c# - .Net中的自定義安裝程序顯示安裝程序後面的表單



winforms installer (7)

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

我需要在默認的Windows Installer UI前面顯示最頂層的窗體。 以上是我CustomAction中用於創建窗體的示例代碼。 設置TopMost屬性或使用ShowDialog不起作用。 有沒有其他的解決方案,使我的形式最頂級和重點?


Answer #1

如果您想完全控制安裝程序的用戶界面進行品牌或自定義對話框,並且不想使用安裝程序生成器軟件(如InstallShield),那麼您可以創建一個C ++應用程序作為Windows Installer的外殼程序 - 不需要實現安裝程序諸如自己複製文件的操作。

Windows Installer具有用於此目的的API。 使用函數MsiSetExternalUIRecord,您可以提供回調來捕獲安裝程序通知,如消息和進度更新。


Answer #2

雖然我不確定你在問什麼,但使用WiX構建Windows安裝程序是最好的選擇。 在那裡你可以建立你的表單和自定義操作,還有其他的東西。


Answer #3

最上面的不會工作。 只需使自定義操作中顯示的表單大於MSI安裝程序表單即可。



Answer #5

如果您想在安裝程序中顯示自己的用戶界面,則無法使用安裝和部署項目,因為它缺少實現該功能所需的功能。 考慮使用像WiXInno Setup這樣的安裝工具包。

關於你的問題的第一部分,你是否將owner參數中的自定義對話框傳遞給MessageBox.Show()


Answer #6

調用最小化和還原/顯示表單的方法,這解決了你的問題。


Answer #7

您可以使用表單選項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;
  }
}