[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前面显示topmostForm。以上是我用于创建表单的CustomAction中的示例代码。设置TopMost属性或使用ShowDialog没有帮助。有没有其他解决方案可以使我的表格成为最重要的并且专注于?
答案 0 :(得分:3)
如果要在安装程序中显示自己的UI,则无法使用安装和部署项目,因为它缺少实现该功能所需的功能。请考虑使用WiX或Inno Setup之类的安装工具包。
关于问题的第一部分,您是否将owner
参数中的自定义对话框传递给MessageBox.Show()?
答案 1 :(得分:2)
虽然我不确定你究竟要求的是什么,但使用WiX来构建Windows安装程序是首选的方法。在那里,您可以构建表单和自定义操作以及其他任何操作。
答案 2 :(得分:2)
如果您希望完全控制用于品牌或自定义对话框的安装程序用户界面,并且不想使用InstallShield等安装程序构建器软件,那么您可以创建一个C ++应用程序作为Windows Installer的shell - 不需要实现安装程序操作,例如自己复制文件。
Windows Installer具有用于此目的的API。使用函数MsiSetExternalUIRecord,您可以提供回调以捕获安装程序通知,例如消息和进度更新。
答案 3 :(得分:2)
自定义操作创建的对话框始终显示在较新的Windows版本(Vista和Windows 7)上的安装对话框后面。这是因为Windows阻止应用程序在所有其他窗口之上移动窗口。想想病毒弹出窗口如何填满旧版Windows上的屏幕。
相反,新创建的对话框会在后台显示,而标题栏按钮(如果有的话)会闪烁。
您需要的正确解决方案是在MSI包中创建一个对话框,并使用它而不是自定义操作。
答案 4 :(得分:2)
最重要的是不起作用。只需使表单显示在大于MSI安装程序表单的自定义操作中。
答案 5 :(得分:1)
答案 6 :(得分:1)
我尝试了同样的方法,我可以看到表格。我能看到的唯一不同就是你缺少base.OnAfterInstall(savedState);在你的代码中。
如果它仍然没有显示尝试只放置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);
}
答案 7 :(得分:1)
您可以使用表单选项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;
}
}
答案 8 :(得分:0)
调用最小化和恢复/显示表单的方法,这可以解决您的问题。
答案 9 :(得分:0)
在this.focus()
方法中致电form.OnLoad
。
这使它出现在安装程序面前。简单的修复。