MessageBox.Show在安装项目中不是模态的

时间:2011-03-07 10:03:13

标签: windows visual-studio-2010 installer setup-project

我有一个VS2010安装项目,其中一个卸载自定义操作使用MessageBox.Show方法显示通知,但它们有时似乎位于安装向导窗口后面,这是完全不可接受的。有没有办法在向导上显示它们,也许让它们模态化?或者,如果不能以永远在线或模态的方式显示消息框,我应该创建自定义窗口吗? 我没有在messagebox.show方法中指定任何所有者。 自定义操作调用dll中的类的方法,而不是exe文件。 我试图找到名为“msiexec”和mainwindowtitle ==我的安装项目向导窗口标题的进程,但是在卸载的情况下,两个进程都没有任何窗口标题和句柄,尽管显示了卸载窗口!

4 个答案:

答案 0 :(得分:2)

我应该在MessageBox.Show方法中使用MessageBoxOptions.DefaultDesktopOnly。

答案 1 :(得分:0)

您可以创建一个继承表单(添加新的Windows表单 - >继承表单) 或签出MessageBox的第二个构造函数(IWin32Window)并分配owner属性。它在指定对象前面显示一个消息框。

答案 2 :(得分:0)

在卸载(以及修复)过程中,安装程序由explorer.exe而不是msiexec.exe运行。因此,在建议here的解决方案中,尝试在“资源管理器”进程中查找设置窗口,如果在“msiexec”中找不到它。请注意,与msiexec不同,在资源管理器的情况下,设置窗口不是主窗口。因此,您需要p / invoke EnumWindowsGetWindowThreadProcessId来获取窗口。

答案 3 :(得分:0)

只要您只进行一个设置过程,这在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(); }