我不时使用MessageBox
为用户弹出警报消息。我的特定应用程序可以设置为远程运行,因此有时用户位于计算机前,有时用户可能不在计算机前几小时甚至几天。有时我会使用MessageBox
弹出警告消息,但在一段时间后警报不再相关。例如,我弹出一个警告,由于某些标准未得到满足,无法完成任务。几分钟后,该标准得到满足,任务就开始了。 MessageBox
不再相关。
我希望能够在消息不再相关的情况下以编程方式关闭MessageBox
。这可能吗?目前,我使用以下命令在线程中创建MessageBox
个对象:
new Thread(() => MessageBox.Show("Some text", "Some caption")).Start();
我这样做是为了让应用程序可以继续在后台运行而不会被MessageBox
暂停。有什么建议吗?
答案 0 :(得分:4)
这对我有用
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()
中的字幕必须相同!
可能通过全局变量,但这取决于你。
答案 1 :(得分:3)
为什么不制作自定义消息框?您可以让它显示一段固定的时间,或直到您的应用通过代码关闭它。
创建自定义消息框的实例(Form类的子代)并将其另存为变量(例如MyMessageBox
),然后将其显示为MyMessageBox.Show();
。如果要将其删除,致电MyMessageBox.Close();
如果你在另一个线程中打开它时遇到问题,请尝试调用MyMessageBox.Invoke(new Action(() => {MyMessageBox.Close();}));
那将在创建的同一个线程MyMessageBox.Close();
上运行命令MyMessageBox
,以便不导致问题。
答案 2 :(得分:1)
您可以使用下面的类轻松创建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);
答案 3 :(得分:0)
为您的条件设置例外,以了解何时启动msgbox或不启用。例如:
if (criteria)
{
new Thread(() => MessageBox.Show("Some text", "Some caption")).Start();
}
else
{
//do nothing
}
答案 4 :(得分:0)
您可能需要考虑邮件的LogFile以及主窗体中嵌入的richtextbox(或多行文本框),然后您可以在那里发布邮件(每行1个,以及时间戳)。至于你的消息框问题,我不确定是否有一种(好的)方式以编程方式关闭它们。(中止线程将无效)。
答案 5 :(得分:0)
如果您使用DevExpress,那么您可以执行以下操作: 应用程序具有属性OpenForms,其中包含所有打开的应用程序形式。你钢铁找不到特定的消息框,但你可以关闭所有的XtraMessageBox。或者,如果您在某些任务/线程中运行MessageBox,请在关闭之前检查它。