我有一个VS2010安装项目,其中一个卸载自定义操作使用MessageBox.Show方法显示通知,但它们有时似乎位于安装向导窗口后面,这是完全不可接受的。有没有办法在向导上显示它们,也许让它们模态化?或者,如果不能以永远在线或模态的方式显示消息框,我应该创建自定义窗口吗? 我没有在messagebox.show方法中指定任何所有者。 自定义操作调用dll中的类的方法,而不是exe文件。 我试图找到名为“msiexec”和mainwindowtitle ==我的安装项目向导窗口标题的进程,但是在卸载的情况下,两个进程都没有任何窗口标题和句柄,尽管显示了卸载窗口!
答案 0 :(得分:2)
我应该在MessageBox.Show方法中使用MessageBoxOptions.DefaultDesktopOnly。
答案 1 :(得分:0)
您可以创建一个继承表单(添加新的Windows表单 - >继承表单) 或签出MessageBox的第二个构造函数(IWin32Window)并分配owner属性。它在指定对象前面显示一个消息框。
答案 2 :(得分:0)
在卸载(以及修复)过程中,安装程序由explorer.exe而不是msiexec.exe运行。因此,在建议here的解决方案中,尝试在“资源管理器”进程中查找设置窗口,如果在“msiexec”中找不到它。请注意,与msiexec不同,在资源管理器的情况下,设置窗口不是主窗口。因此,您需要p / invoke EnumWindows和GetWindowThreadProcessId来获取窗口。
答案 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(); }