C# 当应用程序最小化到托盘时,将消息框前置

C# 当应用程序最小化到托盘时,将消息框前置,c#,.net,winforms,messagebox,system-tray,C#,.net,Winforms,Messagebox,System Tray,我有一些代码可以弹出一个消息框: MessageBox.Show(this, "You have not inputted a username or password. Would you like to configure your settings now?", "Settings Needed", MessageBoxButtons.YesNo, Mes

我有一些代码可以弹出一个消息框:

MessageBox.Show(this,
                 "You have not inputted a username or password. Would you like to configure your settings now?",
                 "Settings Needed",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Question);
我的问题是当这个弹出时,我的应用程序通常会最小化到托盘。因此,messagebox不会出现在前面,也不会出现在开始栏上。唯一能看到它的方法是按alt键

以下是将我的应用程序(父应用程序)最小化到任务栏的代码:

if (FormWindowState.Minimized == WindowState)
{                
      Hide();                
}
你可以这样试试

MessageBox.Show(new Form() { TopMost = true }, "You have not inputted a username or password. Would you like to configure your settings now?",
                 "Settings Needed",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Question);

有一个额外的标志,您可以指定为标准窗口的一个选项,该选项未在WinForms包装中公开

您要查找的内容称为
MB_TOPMOST
,它确保消息框显示为桌面上最顶部的窗口。只需修改代码,如下所示:

MessageBox.Show(this,
                "You have not inputted a username or password. Would you like to configure your settings now?",
                "Settings Needed",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question,
                MessageBoxDefaultButton.Button1,  // specify "Yes" as the default
                (MessageBoxOptions)0x40000);      // specify MB_TOPMOST

我只需要这个测试,所以如果你不介意特别俗气的话, MessageBoxOptions.ServiceNotification将完成此任务

        MessageBox.Show(message,
            "Error",
            MessageBoxButton.YesNo,
            MessageBoxImage.Exclamation,
            MessageBoxResult.OK,
            MessageBoxOptions.ServiceNotification);

更正确的方法是将MessageBox的所有者设置在所有窗口的顶部(无任务栏图标):

MessageBox和所有窗口顶部的应用程序(无任务栏图标):


所有窗口顶部的MessageBox,加上托盘图标(应用程序失去焦点):

messageboxbutton.OK
boxIcon
是前两个选项中的可选参数

设置TopLevel不起任何作用;这已经是事实了


没有直接的方法将MessageBox置于其父窗体的中心。(除了可能将父窗体居中。)

太好了!当我关闭消息框时,它也会杀死该表单,对吗?@nextgenneo:没有理由仅仅为了显示一个消息框而创建一个新表单。请参阅我的答案以获得更好的解决方案。(不,它不一定会杀死表单。它仍在后台运行。)
表单
具有
IDisposable
,因此建议在其周围使用
using
。这是一个更好的解决方案(在这种情况下,重用最上面的实例)的原因是,如果您打开多个对话框,它们都可以成为实际可见的对话框,你不知道我的应用程序是做什么的,也不知道这在问题的背景下是否可以接受,所以如果你不想成为建设性的人,就不要发表评论。更好的解决方案是什么?它仍然没有出现在最前面或最上面。我无法拖动消息框或单击“确定/关闭”按钮。@shakthi显然TopMost在vista上不起作用。也许这就是你的问题,请看:我原以为这就是我要寻找的答案,但后来-vb.net拒绝了。“参数'options'(262144)的值对于枚举类型'MessageBoxOptions'无效。”。。有线索吗?这在WPF应用程序中不起作用。您会遇到一个异常,MessageBoxOptions枚举不喜欢0x40000值。@Peter pete-您应该能够在vb.net中将其用作参数:
CType(&H40000,MessageBoxOptions)
。为我做了一件好事。比旋转一个新的表单并将其标记为最顶端要好得多的解决方案。还有MessageBoxImage的选项。没有一个可以去掉俗气的图像。这是唯一适合我的解决方案。我确实需要更正一些语法,但它在Windows 10.Net Core 3.1上非常有效。如果您的程序中没有任何表单,则此功能非常有效。我有一个程序,它通过单击windows资源管理器上下文菜单中的一个条目来运行。该程序没有表单,将在后台静默执行一秒钟。我只是想在出现问题时在顶部显示一个消息框。我的应用程序在任务栏图标中,我希望消息框首先出现在前面,但不要停留在顶部。如果我单击另一个窗口,messagebox不应停留在顶部。我还想同时打开几个消息框,这样当用户将鼠标放在任务栏上时,他们可以看到所有消息框的预览(这与默认消息框一起工作,但当它第一次出现时,我无法将其放在前面)。
MessageBox.Show(new Form() { TopMost = true }, boxText, "Box Title",
                MessageBoxButtons.OK, boxIcon);
TopMost = true;
MessageBox.Show(boxText, "Box Title", MessageBoxButtons.OK, boxIcon);
TopMost = false;
MessageBox.Show(boxText, "Box Title", MessageBoxButtons.OK, boxIcon, 0,
                MessageBoxOptions.DefaultDesktopOnly);
// (The "0" can also be "MessageBoxDefaultButton.Button1".)