当前位置: 首页 > news >正文

[转]C#中捕捉对话框的文本内容 EnumChildWindows

如何找到桌面上报错的窗口,不管是父窗口还是子窗口,而且获得它的出错信息呢? 

主要是利用API函数: 

复制 保存
[DllImport("user32.dll")]
public static extern int FindWindowEx(int hwndParent, int hwndChildAfter,
    string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
public static extern int FindWindow(string strclassName, string strWindowName);
[DllImport("user32.dll")]
public static extern int GetLastActivePopup(int hWnd);
[DllImport("user32.dll")]
public static extern int AnyPopup();
[DllImport("user32.dll")]
public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
public static extern int EnumThreadWindows(int dwThreadId, CallBack lpfn, int lParam);
[DllImport("user32.dll")]
public static extern int EnumWindows(CallBack lpfn, int lParam);
[DllImport("user32.dll")]
public static extern int EnumChildWindows(int hWndParent, CallBack lpfn, int lParam);


最关键的是对windows操作系统中窗口本质的认识,使用Spy++工具,查找窗口就可以发现,其实对于给定的对话框窗口,其中的任何控件,如图标、文本、确定、取消按钮等都是它的子窗口,本质上还是窗口,所不同的只是,顶级父窗口查找时,用FindWindow函数,而查找子窗口时用FindWindowEx。 

另外比较有用的是EnumWindows,可以遍历所有的顶级父窗口,而EnumChildWindows则是遍历其子窗口。经过测试,EnumThreadWindows的回调函数无法调用,不知道是什么原因,望高手指教。 

所以问题的解决思路就是使用EnumWindows遍历所有的顶级父窗口,对每个顶级父窗口使用EnumChildWindows遍历它的所有控件,每个控件其实也是窗口,拿到该控件的句柄后,就可以调用GetWindowText来获取文本信息了。 

具体实现时,首先需要定义以上API函数的回调函数代理: 

复制 保存
/// <summary>
/// 回调函数代理
/// </summary>
public delegate bool CallBack(int hwnd, int lParam);


然后必须针对每个API函数定义代理的实例函数: 

复制 保存
/// <summary>
/// 进程回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public static bool ThreadWindowProcess(int hwnd, int lParam)
{
    EnumChildWindows(hwnd, callBackEnumChildWindows, 0);
    return true;
}
/// <summary>
/// 窗口回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public static bool WindowProcess(int hwnd, int lParam)
{
    EnumChildWindows(hwnd, callBackEnumChildWindows, 0);
    return true;
}
/// <summary>
/// 子窗口回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public static bool ChildWindowProcess(int hwnd, int lParam)
{
    StringBuilder title = new StringBuilder(200);
    int len;
    len = GetWindowText(hwnd, title, 200);
    if (len > 0)
    {
        if (title.ToString().IndexOf(GlobalManager.ErrorMessage) != -1)
        {
            FindError = true;
        }
    }
    return true;
}


最后要定义回调代理的实例 

复制 保存
/// <summary>
/// 进程窗口回调函数代理
/// </summary>
public static CallBack callBackEnumThreadWindows = new CallBack(ThreadWindowProcess);
/// <summary>
/// 窗口回调函数代理
/// </summary>
public static CallBack callBackEnumWindows = new CallBack(WindowProcess);
/// <summary>
/// 子窗口回调函数代理
/// </summary>
public static CallBack callBackEnumChildWindows = new CallBack(ChildWindowProcess);


使用的例子: 

复制 保存
/// <summary>
/// 客户端是否弹出对话框
/// </summary>
/// <returns></returns>
public bool IsClientPopupWindows()
{
    bool FindError = false;
    EnumWindows(callBackEnumWindows, 0);
    return FindError;
}

转载于:https://www.cnblogs.com/zhangchenliang/archive/2012/08/08/2628836.html

相关文章:

  • (转)LINQ之路
  • 创建dialog
  • SQL Scripts Template Files Path
  • OS命令注入中的空格
  • //解决validator验证插件多个name相同只验证第一的问题
  • IE6 jQuery append()函数 与 JS appendChild(elem) 函数 报错原因
  • 管理者的最基本职责是什么?
  • spark
  • redis查看数据
  • C# 获取listview中选中一行的值
  • 火锅惹的祸
  • 使用sqlserver的游标功能来导数据的常见写法
  • 深入理解mybatis参数
  • 【Todo】Tomcat与Jetty的比较 以及Tomcat架构的学习
  • linux每日一学--复习日
  • avalon2.2的VM生成过程
  • CentOS 7 防火墙操作
  • ECS应用管理最佳实践
  • JavaScript中的对象个人分享
  • Java知识点总结(JavaIO-打印流)
  • Less 日常用法
  • Python3爬取英雄联盟英雄皮肤大图
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue.js源码(2):初探List Rendering
  • webpack4 一点通
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端相关框架总和
  • 删除表内多余的重复数据
  • 探索 JS 中的模块化
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 在weex里面使用chart图表
  • 2017年360最后一道编程题
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)linux 命令大全
  • .“空心村”成因分析及解决对策122344
  • .libPaths()设置包加载目录
  • .NET Micro Framework初体验
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @JoinTable会自动删除关联表的数据
  • @KafkaListener注解详解(一)| 常用参数详解
  • [android] 请求码和结果码的作用
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [bzoj4240] 有趣的家庭菜园
  • [moka同学笔记]yii表单dropdownlist样式
  • [one_demo_13]ArrayList去除重复的元素
  • [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作...
  • [Vue] TodoList 案例
  • [Wap]OnViewStateExpire异常的处理办法
  • [zt]提问的艺术
  • [备忘]谷歌员工证实PR值不再更新 呼吁用户关注内容