在没有用户输入的情况下以编程方式拆分MessageBox

Mic*_*kus 5 .net c# messagebox winforms

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

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

new Thread(() => MessageBox.Show("Some text", "Some caption")).Start();
Run Code Online (Sandbox Code Playgroud)

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

And*_*ndy 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

但是有一点,标题必须是相同的CloseMessageBox()ShowMessageBox()

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


Pho*_*gan 2

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

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

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