Windows Forms MessageBox

本文关键字:MessageBox Forms Windows | 更新日期: 2023-09-27 18:24:12

我在Visual Studio中编码的一个小工具中使用了一个Message Box,它每天运行并将信息输出到桌面上的弹出窗口。然而,如果我打开了另一个窗口,消息框就会在它后面丢失,可能会被忽视。我想知道是否有任何方法可以确保消息框始终显示在所有其他打开的桌面应用程序的顶部。此外,有没有一种方法可以创建一个消息框,不允许我在不退出消息框的情况下在桌面上做任何其他事情?例如,在消息框消失之前,我无法打开消息框顶部的另一个应用程序。

提前感谢您的任何建议或替代方案!这是我第一次使用MessageBox对象,所以我对它的功能了解非常有限。

Windows Forms MessageBox

如果您希望在自己的应用程序中保持您的表单与其他表单的最大优势,您可以使用

MyForm.TopMost = true;

否则,如果你想让你的应用程序在windows操作系统中的其他窗口之上,你必须调用Win32函数。这里有一个的例子

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
        static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
        static readonly IntPtr HWND_TOP = new IntPtr(0);
        static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
        const UInt32 SWP_NOSIZE = 0x0001;
        const UInt32 SWP_NOMOVE = 0x0002;
        const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
        }
    }
}

MessageBox无法将其设置为TopMost。它会出现在您自己程序中的其他表单之上,但不一定会出现在其他程序之上。

您可以创建自己的Form,并将其设计为看起来MessageBox,然后将TopMost属性设置为True。这将显示在大多数窗口的顶部。

但这仍然不能保证。如果您运行的另一个应用程序有设置为TopMost的内容,那么它不会出现在这些内容之上。即使存在TopMosterTopMostestest性质。。。好多个程序也可以使用这些。

最后,确实不能保证你的窗口显示在用户正在做的所有事情之上。

作为替代方案,也许您可以对NotifyIcon类进行一些研究,并在任务栏中的弹出气球中显示消息?这也会吸引注意力,而不会打断你正在进行的任何事情。