7

MessageBox不时使用 a 为用户弹出警报消息。我的特定应用程序可以设置为远程运行,因此有时用户在计算机前,而有时用户可能数小时甚至数天都不在计算机前。有时我会弹出一条警报消息,MessageBox但在一段时间后警报不再相关。例如,我弹出一个警报,指出由于某些条件未满足而无法完成任务。几分钟后,该标准得到满足,任务开始。这MessageBox不再相关。

MessageBox在这些消息不再相关的情况下,我希望能够以编程方式关闭。这可能吗?MessageBox目前我使用以下方法在线程中创建我的对象:

new Thread(() => MessageBox.Show("Some text", "Some caption")).Start();

我这样做是为了让应用程序可以继续在后台工作,而不会被MessageBox. 有什么建议么?

4

6 回答 6

6

这对我有用

public partial class Form1 : Form
{
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

    [DllImport("user32.Dll")]
    static extern int PostMessage(IntPtr hWnd, UInt32 msg, int wParam, int lParam);

    const UInt32 WM_CLOSE = 0x0010;

    Thread thread;

    public Form1()
    {
        InitializeComponent();

        thread = new Thread(ShowMessageBox);
        thread.Start();
    }

    void CloseMessageBox()
    {
        IntPtr hWnd = FindWindowByCaption(IntPtr.Zero, "Caption");
        if (hWnd != IntPtr.Zero)
            PostMessage(hWnd, WM_CLOSE, 0, 0);

        if (thread.IsAlive)
            thread.Abort();
    }

    static void ShowMessageBox()
    {
        MessageBox.Show("Message", "Caption");
    }
}

现在您可以使用CloseMessageBox()来关闭消息框。

CloseMessageBox()但请记住,和!中的标题必须相同ShowMessageBox()

也许通过一个全局变量,但这取决于你。

于 2013-10-28T13:45:13.200 回答
2

为什么不制作自定义消息框?你可以让它显示一段固定的时间,或者直到你的应用程序通过代码关闭它。

创建一个自定义消息框的实例(Form 类的子级)并将其保存为变量(例如MyMessageBox),然后用 . 显示它MyMessageBox.Show();。当你想把它取下来时,调用MyMessageBox.Close();

如果在另一个线程中打开它时关闭它时遇到问题,请尝试调用MyMessageBox.Invoke(new Action(() => {MyMessageBox.Close();}));That 将在创建MyMessageBox.Close();的同一线程上运行命令MyMessageBox,以免引起问题。

于 2013-10-28T14:15:40.703 回答
2

您可以使用以下类轻松创建 MessageBox:

using System;
using System.Runtime.InteropServices;

public class MsgBox
{
    [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern bool EndDialog(IntPtr hDlg, int nResult);

    [DllImport("user32.dll")]
    static extern int MessageBoxTimeout(IntPtr hwnd, string txt, string caption,
        int wtype, int wlange, int dwtimeout);

    const int WM_CLOSE = 0x10;

    public static int Show(string text, string caption, int milliseconds, MsgBoxStyle style)
    {
        return MessageBoxTimeout(IntPtr.Zero, text, caption, (int)style, 0, milliseconds);
    }

    public static int Show(string text, string caption, int milliseconds, int style)
    {
        return MessageBoxTimeout(IntPtr.Zero, text, caption, style, 0, milliseconds);
    }
    public static int Show(string text, string caption, int milliseconds)
    {
        return MessageBoxTimeout(IntPtr.Zero, text, caption, 0, 0, milliseconds);
    }
}

public enum MsgBoxStyle
{
    OK = 0, OKCancel = 1, AbortRetryIgnore = 2, YesNoCancel = 3, YesNo = 4,
    RetryCancel = 5, CancelRetryContinue = 6,

    RedCritical_OK = 16, RedCritical_OKCancel = 17, RedCritical_AbortRetryIgnore = 18,
    RedCritical_YesNoCancel = 19, RedCritical_YesNo = 20,
    RedCritical_RetryCancel = 21, RedCritical_CancelRetryContinue = 22,

    BlueQuestion_OK = 32, BlueQuestion_OKCancel = 33, BlueQuestion_AbortRetryIgnore = 34,
    BlueQuestion_YesNoCancel = 35, BlueQuestion_YesNo = 36,
    BlueQuestion_RetryCancel = 37, BlueQuestion_CancelRetryContinue = 38,

    YellowAlert_OK = 48, YellowAlert_OKCancel = 49, YellowAlert_AbortRetryIgnore = 50,
    YellowAlert_YesNoCancel = 51, YellowAlert_YesNo = 52,
    YellowAlert_RetryCancel = 53, YellowAlert_CancelRetryContinue = 54,

    BlueInfo_OK = 64, BlueInfo_OKCancel = 65, BlueInfo_AbortRetryIgnore = 66,
    BlueInfo_YesNoCancel = 67, BlueInfo_YesNo = 68,
    BlueInfo_RetryCancel = 69, BlueInfo_CancelRetryContinue = 70,
}

用法:

MsgBox.Show("this is content", "this is caption", 3000);
于 2018-07-18T07:45:34.530 回答
0

为您的标准设置一个例外,以了解何时启动 msgbox 或不启动。例子:

if (criteria)
{
    new Thread(() => MessageBox.Show("Some text", "Some caption")).Start();
}
else
{
    //do nothing
}
于 2013-10-28T13:15:33.357 回答
0

您可能希望为您的消息考虑一个日志文件,以及嵌入在您的主表单中的丰富文本框(或多行文本框),然后您可以在其中发布您的消息(每行 1 个,以及时间戳)。至于您的消息框问题,我不确定是否有(好的)方法可以以编程方式关闭它们。(中止线程不起作用)。

于 2013-10-28T13:24:05.530 回答
0

如果您使用 DevExpress,那么您可以执行以下操作: 应用程序具有属性OpenForms,其中包含所有开放的应用程序形式。您无法找到特定的消息框,但您可以关闭所有 XtraMessageBox。或者,如果您在某个任务/线程中运行 MessageBox,请在关闭前检查它。

于 2014-05-16T06:28:33.423 回答