加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# MessageBox自动关闭

发布时间:2020-12-16 01:13:31 所属栏目:百科 来源:网络整理
导读:本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭。特别是一些第三方插件(如:dll)弹出的对话框,最为适用。本文仅供学习分享使用,如有不足之处,还请指正。 概述 在程序中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的区分,请点链接

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读