C#根据弹窗标题获取窗体句柄并模拟点击按钮(FindWindow,FindWindowEx,SendMessage)

任务:将下面弹窗自动关闭

 

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
/// <summary>
/// 找到窗口
/// </summary>
/// <param name="lpClassName">窗口类名(例:Button)</param>
/// <param name="lpWindowName">窗口标题</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
 
/// <summary>
/// 找到窗口
/// </summary>
/// <param name="hwndParent">父窗口句柄(如果为空,则为桌面窗口)</param>
/// <param name="hwndChildAfter">子窗口句柄(从该子窗口之后查找)</param>
/// <param name="lpszClass">窗口类名(例:Button</param>
/// <param name="lpszWindow">窗口标题</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
 
/// <summary>
/// 发送消息
/// </summary>
/// <param name="hwnd">消息接受窗口句柄</param>
/// <param name="wMsg">消息</param>
/// <param name="wParam">指定附加的消息特定信息</param>
/// <param name="lParam">指定附加的消息特定信息</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
 
//窗口发送给按钮控件的消息,让按钮执行点击操作,可以模拟按钮点击
private const int BM_CLICK = 0xF5;

 通过窗体标题,循环查找该窗体,然后找到确定按钮,通过句柄发送点击消息,主动关闭弹窗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void Form1_Load(object sender, EventArgs e)
       {
           Task task = new Task(() =>
           {
               while (true)
               {
                   //测试警告框
                   IntPtr maindHwnd = FindWindow(null, "提示");//主窗口标题
                   if (maindHwnd != IntPtr.Zero)
                   {
                       IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "确定");//按钮控件标题
                       if (childHwnd != IntPtr.Zero)
                       {
                           SendMessage(childHwnd, BM_CLICK, 0, 0);
                       }
                   }
               }
           });
 
           task.Start();
       }

  

 

参考:

https://www.cnblogs.com/easypass/p/4067484.html

https://www.cnblogs.com/tary2017/articles/8031782.html

posted @   翻白眼的哈士奇  阅读(11065)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
历史上的今天:
2017-03-21 Linux netstat命令详解
2017-03-21 服务器开发工具
点击右上角即可分享
微信分享提示