C# MessageBox自动关闭
发布时间:2020-12-16 01:13:31 所属栏目:百科 来源:网络整理
导读:本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭。特别是一些第三方插件(如:dll)弹出的对话框,最为适用。本文仅供学习分享使用,如有不足之处,还请指正。 概述 在程序中MessageBox弹出的对话框,用于向用户展示消息,这
本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭。特别是一些第三方插件(如:dll)弹出的对话框,最为适用。本文仅供学习分享使用,如有不足之处,还请指正。 概述在程序中MessageBox弹出的对话框,用于向用户展示消息,这是一个模式窗口,可阻止应用程序中的其他操作,直到用户将其关闭。但是有时候在自动化程序中,如果弹出对话框,程序将会中断,等待人工的干预,这是一个非常不好的交互体验,如果程序能够自动帮我们点击其中一个按钮,让对话框消失,该有多好。 原理通过对话框的标题查找对话框,获取对话框的句柄,然后对话框发送指令。 涉及知识点
示例截图如下:关键代码核心代码如下: 1 using System; 2 System.Collections.Generic; 3 System.Drawing; 4 System.Linq; 5 System.Runtime.InteropServices; 6 System.Text; 7 System.Threading; 8 System.Threading.Tasks; 9 10 namespace DemoMessageBox 11 { 12 /// <summary> 13 /// 作者:Alan.hsiang 14 日期:2018-04-18 15 描述:通过WinAPI进行查找窗口,并对窗口进行操作 16 </summary> 17 public class MessageBoxHelper 18 { 19 20 查找窗口 21 22 <param name="hwnd">窗口句柄</param> 23 <param name="title">窗口标题 24 <returns></returns> 25 [DllImport("user32.dll",CharSet = CharSet.Auto)] 26 static extern IntPtr FindWindow(IntPtr hwnd,string title); 27 28 29 移动窗口 30 31 32 <param name="x">起始位置X 33 <param name="y">起始位置Y 34 <param name="nWidth">窗口宽度 35 <param name="nHeight">窗口高度 36 <param name="rePaint">是否重绘 37 [DllImport( 38 extern void MoveWindow(IntPtr hwnd,1)">int x,1)">int y,1)">int nWidth,1)">int nHeight,1)">bool rePaint); 39 40 41 获取窗口矩形 42 43 44 <param name="rect"></param> 45 46 [DllImport( 47 bool GetWindowRect(IntPtr hwnd,1)">out Rectangle rect); 48 49 50 向窗口发送信息 51 52 53 <param name="msg">信息 54 <param name="wParam">高字节 55 <param name="lParam">低字节 56 57 [DllImport( 58 int PostMessage(IntPtr hwnd,1)">int msg,1)">uint wParam,1)">uint lParam); 59 60 const int WM_CLOSE = 0x10; //关闭命令 61 62 int WM_KEYDOWN = 0x0100;按下键 63 64 int WM_KEYUP = 0x0101;按键起来 65 66 int VK_RETURN = 0x0D;回车键 67 68 bool IsWorking = false; 69 70 71 对话框标题 72 73 string[] titles = new string[4] { 请选择提示错误警告" }; 74 75 76 查找和移动窗口 77 78 79 80 81 void FindAndMoveWindow(string title,1)">int y) 82 { 83 Thread t = new Thread(() => 84 { 85 IntPtr msgBox = IntPtr.Zero; 86 while ((msgBox = FindWindow(IntPtr.Zero,title)) == IntPtr.Zero) ; 87 Rectangle r = new Rectangle(); 88 GetWindowRect(msgBox,1)"> r); 89 MoveWindow(msgBox,x,y,r.Width - r.X,r.Height - r.Y,1)">true); 90 }); 91 t.Start(); 92 } 93 94 95 查找和关闭窗口 96 97 标题 98 private void FindAndKillWindow( title) 99 100 IntPtr ptr = FindWindow(IntPtr.Zero,title); 101 if (ptr != IntPtr.Zero) 102 103 int ret = PostMessage(ptr,WM_CLOSE,1)">0,1)">0104 Thread.Sleep(1000105 ptr =106 107 { 108 PostMessage(ptr,WM_KEYDOWN,VK_RETURN,1)">109 PostMessage(ptr,WM_KEYUP,1)">110 } 111 } 112 113 114 115 116 117 void FindAndKillWindow() 118 119 Thread t = 120 121 while (IsWorking) 122 123 按标题查找 124 foreach (string title in titles) 125 { 126 FindAndKillWindow(title); 127 } 128 Thread.Sleep(3000129 130 131 132 133 } 134 } ? 备注 关于源码,请点击链接自行下载。 关于PostMessage和SendMessage的区分,请点链接 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容