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

发布于 2024-10-20 18:54:45 字数 305 浏览 1 评论 0原文

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

I have a VS2010 setup project, and one of it's uninstall custom actions shows notifications using MessageBox.Show method, but they sometimes appear to be behind the setup wizard window, which is totally unacceptable. Is there a way to show them on top of the wizard, maybe make them modal? Or should I create custom windows if it is impossible to show message boxes in a always-on-top or modal way?
I am not specifying any owners in the messagebox.show method.
The custom action calls a method of a class inside dll, not exe file.
I tried to find the process with name "msiexec" and mainwindowtitle == my setup project wizard window title, but in case of uninstall both processes just don't have any window titles and handles, although the uninstall window is displayed!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

转身泪倾城 2024-10-27 18:54:45

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

I should use MessageBoxOptions.DefaultDesktopOnly in the MessageBox.Show method.

一枫情书 2024-10-27 18:54:45

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

This works while installing or uninstalling on Windows XP and 7, as long as you have only one setup process going on:

        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(); }
许仙没带伞 2024-10-27 18:54:45

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

You can create a Inherited Form (Add new Windows Form -> Inherited Form)
or checkout the second constructor (IWin32Window) of MessageBox and assign the owner property. It displays a message box in front of the specified object.

行至春深 2024-10-27 18:54:45

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

It looks like during uninstall (and also repair), the setup is run by explorer.exe instead of msiexec.exe. So in the solution suggested here, try looking for the setup window in "explorer" process, if it's not found in "msiexec". Note that unlike msiexec, in case of explorer the setup window is not the main window. So you will need to p/invoke EnumWindows and GetWindowThreadProcessId to get the window.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文