微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# MessageBox自动关闭

本文以一个简单的小例子,介绍如何让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 }
View Code

 

备注

关于源码,请点击链接自行下载。

关于PostMessage和SendMessage的区分,请点链接

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐