请高手帮忙,比如我做出一个响应,弹出一个MessageBox。怎么做让它3秒后自动关闭,点击上面的确定也可以手动关闭、、、、、、、、、、、、、、、、、、、、?谢谢 看网上有说写一个MessageBox继承System.Windows.Form,然后添加一个Timer。能不能有点实例代码,学习一下。代码最好简洁点,要不然看的太乱了。
---------------
写好了,以下是截图和部分源码,完整的源码在附件中:
1.指定要弹出的消息以及定时的时间(单位秒)
![](https://iknow-pic.cdn.bcebos.com/574e9258d109b3de2f872393cdbf6c81800a4c15?x-bce-process=image/resize,m_lfit,w_600,h_800,limit_1)
2.弹出后,对话框上的确定按钮上会动态倒计时,当时间为0时自动关闭,也可以通过点击确定按钮关闭
![](https://iknow-pic.cdn.bcebos.com/4ec2d5628535e5dd71f6612477c6a7efcf1b6277?x-bce-process=image/resize,m_lfit,w_600,h_800,limit_1)
核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public partial class TimingMessageBox : Form
{
// 自动关闭的时间限制,如3为3秒后自动关闭
private int second;
// 计数器,用以判断当前窗口弹出后持续的时间
private int counter;
// 构造函数
public TimingMessageBox(string message, int second)
{
InitializeComponent();
// 显示消息
this.labelMessage.Text = message;
// 获得时间限制
this.second = second;
// 初始化计数器
this.counter = 0;
// 初始化按钮的文本
this.buttonOK.Text = string.Format("确定({0})", this.second - this.counter);
// 激活并启动timer,设置timer的触发间隔为1000毫秒(1秒)
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
// 如果没有到达指定的时间限制
if (this.counter
84 {
85 IntPtr msgBox = IntPtr.Zero;
86 while ((msgBox = FindWindow(IntPtr.Zero, title)) == IntPtr.Zero) ;
87 Rectangle r = new Rectangle();
88 GetWindowRect(msgBox, out r);
89 MoveWindow(msgBox, x, y, r.Width - r.X, r.Height - r.Y, true);
90 });
91 t.Start();
92 }
93
94 ///
95 /// 查找和关闭窗口
96 ///
97 /// 标题
98 private static void FindAndKillWindow(string title)
99 {
100 IntPtr ptr = FindWindow(IntPtr.Zero, title);
101 if (ptr != IntPtr.Zero)
102 {
103 int ret = PostMessage(ptr, WM_CLOSE, 0, 0);
104 Thread.Sleep(1000);
105 ptr = FindWindow(IntPtr.Zero, title);
106 if (ptr != IntPtr.Zero)
107 {
108 PostMessage(ptr, WM_KEYDOWN, VK_RETURN, 0);
109 PostMessage(ptr, WM_KEYUP, VK_RETURN, 0);
110 }
111 }
112 }
113
114 ///
115 /// 查找和关闭窗口
116 ///
117 public static void FindAndKillWindow()
118 {
119 Thread t = new Thread(() =>
120 {
121 while (IsWorking)
122 {
123 //按标题查找
124 foreach (string title in titles)
125 {
126 FindAndKillWindow(title);
127 }
128 Thread.Sleep(3000);
129 }
130 });
131 t.Start();
132 }
133 }
134 }
View Code
备注
关于源码,请点击链接自行下载。
关于PostMessage和SendMessage的区分,请点链接
出处:https://www.cnblogs.com/hsiang/p/8878093.html
====================================================
优化
根据上面的提醒,自己重新优化下,尽量让项目做较少的改动嘛!~
调用Win32的没有变化,只是把关闭窗口的方法精简了以些:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Win32Helper
{
/*先调用GetForegroundWindow然后调用GetWindowFromHwnd*/
//GetForegroundWindow API
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
//从Handle中获取Window对象
private static Form GetWindowFromHwnd(IntPtr hwnd)
{
return Form.FromHandle(hwnd) as Form;
}
///
/// 获取当前顶级窗体,若获取失败则返回主窗体
///
public static Form GetTopWindow()
{
var hwnd = GetForegroundWindow();
if (hwnd == IntPtr.Zero)
{
Process p = Process.GetCurrentProcess();
hwnd = p.MainWindowHandle;
}
return GetWindowFromHwnd(hwnd);
}
///
/// 查找窗口
///
/// 窗口句柄
/// 窗口标题
///
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(IntPtr hwnd, string title);
public const int WM_CLOSE = 0x10; //关闭命令
public const int WM_KEYDOWN = 0x0100;//按下键
public const int WM_KEYUP = 0x0101;//按键起来
public const int VK_RETURN = 0x0D;//回车键
///
/// 向窗口发送信息
///
/// 窗口句柄
/// 信息
/// 高字节
/// 低字节
///
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int PostMessage(IntPtr hwnd, int msg, uint wParam, uint lParam);
}
//弹出消息框
public class MsgBoxHelper
{
private static log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static DialogResult ShowDialog(string msg, IWin32Window win = null, TimeSpan? outTime = null, MessageBoxButtons messageBoxButtons = MessageBoxButtons.OK, MessageBoxIcon messageBoxIcon = MessageBoxIcon.Information)
{
DialogResult dr = DialogResult.None;
var fm = Win32Helper.GetTopWindow();
if (fm.InvokeRequired)
{
fm.Invoke(new EventHandler(delegate { ShowDialog(msg, win, outTime, messageBoxButtons, messageBoxIcon); }));
}
else
{
string strTitle = "消息";
win = win == null ? fm : win;
outTime = outTime == null ? TimeSpan.FromSeconds(5) : outTime;
new Thread(() =>
{
_log.Info($"ShowDialog : 已启动超时退出。超时时间:{outTime.Value.TotalSeconds}");
Thread.Sleep((int)outTime.Value.TotalMilliseconds);
FindAndKillWindow(strTitle);
}).Start();
_log.Info("ShowDialog : Title = " + strTitle + Environment.NewLine + "Msg = " + msg);
dr = MessageBox.Show(win, msg, strTitle, messageBoxButtons,
messageBoxIcon, MessageBoxDefaultButton.Button1);
}
return dr;
}
///
/// 查找和关闭窗口
///
/// 标题
private static void FindAndKillWindow(string title)
{
IntPtr ptr = Win32Helper.FindWindow(IntPtr.Zero, title);
_log.Info($"FindAndKillWindow : 查找窗口标题 = {title},窗口句柄 = " + ptr);
if (ptr != IntPtr.Zero)
{
int ret = Win32Helper.PostMessage(ptr, Win32Helper.WM_CLOSE, 0, 0);
Thread.Sleep(1000);
ptr = Win32Helper.FindWindow(IntPtr.Zero, title);
_log.Info($"FindAndKillWindow : 发送关闭窗口命令结果 = {ret},再次查找[{title}]窗口结果 = " + ptr);
if (ptr != IntPtr.Zero)
{
Win32Helper.PostMessage(ptr, Win32Helper.WM_KEYDOWN, Win32Helper.VK_RETURN, 0);
Win32Helper.PostMessage(ptr, Win32Helper.WM_KEYUP, Win32Helper.VK_RETURN, 0);
}
}
}
}
View Code
|