2014-09-24 89 views
1

我在一个小工具中使用消息框,我在Visual Studio中进行编码,每天运行并将信息输出到桌面上的弹出窗口。但是,如果我打开另一个窗口,则消息框会丢失,并且可能不被注意。我想知道是否有任何方法可以确保消息框始终显示在所有其他打开的桌面应用程序之上。另外,有没有办法创建一个消息框,不会让我在没有首先退出消息框的情况下在桌面上执行其他任何操作?例如,我不能在消息框顶部打开另一个应用程序,直到消息框消失。Windows窗体消息框

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

回答

2

如果你想保持你的窗体顶部与其他形式的在自己的应用大部分可以使用

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); 
     } 
    } 
} 
+0

投票并接受答案,如果回答了您的问题 – Sam 2014-09-25 07:24:04

1

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

你可以创建自己的Form,并设计出MessageBox,那么TopMost属性设置为True。这将显示在大多数窗口之上。

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

最后,确实没有保证您的窗口显示高于用户正在做的一切。

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