本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭。特别是一些第三方插件(如:dll)弹出的对话框,最为适用。本文仅供学习分享使用,如有不足之处,还请指正。
概述
在程序中MessageBox弹出的对话框,用于向用户展示消息,这是一个模式窗口,可阻止应用程序中的其他操作,直到用户将其关闭。但是有时候在自动化程序中,如果弹出对话框,程序将会中断,等待人工的干预,这是一个非常不好的交互体验,如果程序能够自动帮我们点击其中一个按钮,让对话框消失,该有多好。
原理
通过对话框的标题查找对话框,获取对话框的句柄,然后对话框发送指令。
涉及知识点
- MessageBox 显示消息窗口(也称为对话框)向用户展示消息。这是一个模式窗口,可阻止应用程序中的其他操作,直到用户将其关闭。System.Windows.Forms.MessageBox可包含通知并指示用户的文本、按钮和符号。
- Thread 创建和控制线程,设置其优先级并获取其状态。本例子主要创建一个线程,查找弹出的窗口。
- WIN32 API 也就是Microsoft Windows 32位平台的应用程序编程接口。每一个服务,就是一个函数,用于和Windows进行交互。
- MessageBoxButtons 是一个Enum,表示对话框上显示哪些按钮。
- PostMessage 是Windows API(应用程序接口)中的一个常用函数,用于将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。
示例截图如下:
关键代码
核心代码如下:
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的区分,请点链接
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。