@[TOC](易语言转C# .Net(1) 提示框(带超时的MessageBox))
易语言转C# .Net(1) 提示框(带超时的MessageBox)
原因
因为MessageBox会阻塞程序运行,
而我需要的只是一个快捷的给用户提示某些轻量级的操作已经完成,不希望MessageBox来打断用户操作(需要去点某个按钮).
例如:点一个按钮,将TextBox的内容复制到剪辑板,然后去其他程序粘贴.
按了按钮之后会弹出提示框,1秒后自动关闭,这样用户就知道已经复制完成了,且超时时间很短,没必要去点击确定(敲空格也可确定)
亦或是在某些重度的操作下偶尔出现的奇怪错误,但影响不大
例如:批量调用翻译API时,翻译失败,返回的是空文本/原文本,这时候可不能弹出MessageBox阻塞程序运作,弹出超时关闭的提示框(可以在别处输出错误信息),然后程序继续运作
原理:
调用外部dll “user32.dll”(系统自带)中的 MessageBoxTimeoutA
实现方式:
代码位置可以放在这下面
public Form1()
{
InitializeComponent();
}
声明调用外部dll的代码如下
[DllImport("user32.dll")]
public static extern int MessageBoxTimeoutA(IntPtr 父窗口句柄, string 提示内容, string 标题, int 按钮类型, int 固定为0, int 超时时间毫秒);
我自己封装了一层
/// <summary>
/// 弹出一个提示框,可设置按钮,并根据用户操作返回相应值,超过时间自动关闭
/// 原理:调用外部dll "user32.dll"(系统自带)中的 MessageBoxTimeoutA
/// </summary>
/// <param name="父窗口句柄">填this.Handle</param>
/// <param name="提示内容"></param>
/// <param name="标题">默认为 "友情提示"</param>
/// <param name="按钮类型"> 可为按钮与图标的组合值
/// 按钮 0:确定;1:确定+取消;2:终止+重试+忽略;3:是+否+取消;4:是+否;5:重试+取消;6:取消+重试+继续
/// 图标 16:#错误图标(红X); 32:#询问图标(蓝?); 48:#警告图标(黄!); 64:#信息图标(蓝i)
/// 对齐方式 524288:#文本右对齐</param>
/// <param name="超时时间毫秒">超时自动关闭,单位毫秒,默认5000毫秒,填0为不自动关闭</param>
/// <returns>返回用户按下了哪个按钮
/// 0:确定钮,1:取消钮,2:终止钮,3:重试钮,4:忽略钮,5:是钮,6:否钮,31999:超时
/// (注:按钮类型非0时才可能返回31999;按钮类型为0时,超时也返回0:确定钮)
/// (注:存在取消按钮时,右上角X关闭按钮才可以按,此时如按的X,返回1:取消钮)
/// </returns>
public static int 提示框(IntPtr 父窗口句柄, string 提示内容, string 标题="友情提示", int 按钮类型=0, int 超时时间毫秒=5000)
{
return MessageBoxTimeoutA(父窗口句柄, 提示内容, 标题, 按钮类型, 0, 超时时间毫秒) - 1;//第5个参数固定为0,返回值要-1(原因不明)
}
调用示例 按钮事件
private void button1_Click(object sender, EventArgs e)
{
int 按钮 = (int)numericUpDown_按钮类型.Value;
int 返回值 = 提示框(this.Handle, "按钮值:"+ 按钮, "标题", 按钮, 3000);
Console.WriteLine("返回值:" + 返回值);
}