实时高效获取目标窗口的可见区域

(图一)

以图一为例,假设窗口1的RECT为Rect1,窗口2的RECT为Rect2,窗口3的RECT为Rect3。那么窗口1的可见区域(Region)就是Rect1异或(XOR)Rect2后得到的区域,也就在Rect1的基础上将Rect1与Rect2重合部分给挖掉之后的结果。

下面介绍下方案实现:

(图二)

  1. 如上图二所示,首先获取目标窗口的矩形(RECT),这个RECT就是扫描目标的区域,根据这个RECT获取对应的目标Region(通过windows系统API:“CreateRectRgn”即根据RECT获得对应的Region)。
  2. 以矩形框的左上角为起点,水平方向为x轴,竖直方向为y轴,按水平方向从左到右,竖直方向从上到下的方向,扫描点阵以间距为50像素为例进行扫描;首先扫描的点阵范围必在矩形框的范围内,不会超出矩形框的范围,这就可以极大的减少我们需要扫描的目标区域范围。
  3. 首先,在扫描过程中,不断判断当前扫描点的坐标位置是否在自己的目标Region内,如果不在,跳过即可,这样可以减少扫描区域范围,将遮盖区域范围给排除掉能一定程度提升扫描的效率。
  4. 其次,在扫描过程中,判断当前扫描点的坐标对应的窗口句柄(通过windows系统API:“windowFromPoint”,即传入POINT即可得到该坐标对应的句柄值),如果所得到的窗口句柄为目标窗口的句柄,表示当前扫描点位置未被其他窗口遮盖,那么继续进行下一个扫描;如果所得到的窗口句柄不是目标窗口句柄,表示当前扫描点位置已经被其他窗口遮盖,这个时候通过该句柄值获取到对应的RECT(通过windows系统的API:“GetWindowRect”获取对应窗口的RECT),然后通过Region进行异或(XOR)组合(通过windows系统的API:“CombineRgn”来进行Region的合并操作)的方式将与目标区域的重合的部分给剔除掉即可,如此再回到步骤2再进行扫描即可。
  5. .....

    方案的改进和优化
    当然该方案还存在一些缺陷并可以做部分的改进,以下图三为例:

                                                                                 (图三)

    如果扫描的矩阵宽度为50pix,那么扫描矩阵其实就是50*50的正方形,但如果一个条形窗口高度或者宽度小于50pix,那么点阵扫描的时候可能就因为扫描点覆盖不到该条形窗口区域而将遮盖的条形窗口给忽略掉。为此我将扫描矩阵从正方形调整优化为菱形扫描矩阵,即在水平方向上的序号为偶数的点阵向y轴方向向下调整25pix,在几乎同样的扫描矩阵点数的情况下,可以最大限度的避免遗漏掉常见的水平或竖直形状的条形矩形遮盖窗口的判断:

    同时可以做非固定坐标点矩阵的实时扫描也可以最大化的减少部分较小遮盖窗的遗漏情况;同时在目标窗口的四条边界上同时做最后的矩阵扫描操作可以避免窗口边界处部分遮盖而未被扫描点覆盖到的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread 8. RT-Thread Studio arm-gcc使用10.2.1编译

1. gcc编译器下载 E:\RT-ThreadStudio\repo\Extract\ToolChain_Support_Packages\ARM\GNU_Tools_for_ARM_Embedded_Processors2. 把5.4.1 改为5.4.11 再“全部构建”,提示错误 3. 把工具链版本改为10.2.1,再“全部构建”

Django的查询所有,根据用户名查询,增加用户操作

1.路由 from meiduo_admin.user.user_views import UsersViewurlpatterns [# 用户操作路由path(users/, UsersView.as_view()), ]2. 序列化器 from rest_framework import serializersfrom meiduo_admin.models import Userclass UsersSerialize(serializers.ModelSerialize…

python版opencv人脸训练与人脸识别

1.人脸识别准备 使用的两个opencv包 D:\python2023>pip list |findstr opencv opencv-contrib-python 4.8.1.78 opencv-python 4.8.1.78数据集使用前一篇Javacv的数据集,网上随便找的60张图片,只是都挪到了D:\face目录下方便遍历 D:\face\1 30张刘德华图片…

Nacos安装指南:windows版本、linux版本

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: GitHub主页:https://github.com/alibaba/nacos GitHub的Release下载…

Android使用Glide类加载服务器中的图片

Glide类用于从服务器中获取图片并加载进ImageView。 一、添加依赖 Glide为第三方框架,使用时需添加依赖: 在 Gradle Scripts / build.gradle(Module:app) / dependencies方法 中添加 implementation com.github.bumptech.glide:glide:4.12.0 添加后…

【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】🌏题目描述🌙问题…

在Postgresql中进行关键字查找

在Postgresql中通过关键字查询,一般情况下,利用like语句。比如: select name from poi where name like %key word%. 但是众所周知,这样的匹配率不尽如人意。 本文通过示例,利用pg_trgm扩展进行实现更完美的关键字查询…

JVM(三) 垃圾回收

一、自动垃圾回收 1.1 C/C++的内存管理 在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。 内存泄漏指的是不再使用的对象在系统中…

【蓝桥杯选拔赛真题01】C++参赛建议 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++参赛建议 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

矩阵的运算

目标&#xff1a;实现一个能进行稀疏矩阵基本运算(包括加、减、乘)的运算器。 &#xff08;1&#xff09;以三元组顺序表表示稀疏矩阵&#xff0c;实现两个矩阵相加、相减、相乘的运算 &#xff08;2&#xff09;稀疏矩阵的输入形式为三元组表示&#xff0c;运算结果则以通常…

函数指针——回调函数、函数Table

目录 一、前言 二、回调函数 三、函数Table 四、高阶用法 一、前言 开发面对对象的C工程和大型复杂工程中面对多事件多状态情况下&#xff0c;使用函数数组将使工程变得简洁、容易维护 二、回调函数 函数指针&#xff1a; 可变参数&#xff1a; 返回类型 函数名&#xf…

简述JVM

文章目录 JVM简介JVM运行时数据区堆(线程共享)方法区/元空间/元数据区(线程共享)栈程序计数器 JVM类加载类加载过程双亲委派模型 垃圾回收机制(GC)判断对象是否为垃圾判断是否被引用指向 如何清理垃圾, 释放对象? JVM简介 JVM 是 Java Virtual Machine 的简称, 意为Java虚拟机…

VSCode:清理ipch缓存

VSCode使用了一段时间&#xff0c;发现有些变慢&#xff0c;电脑管家扫描后&#xff0c;提示“AppData\Local\Microsoft\vscode-cpptools\ipch”目录下有很多缓存文件可以清理。 查询了一下&#xff1a;C/C 扩展常见问题解答 (visualstudio.com) 该件夹内包含缓存的预编译头文…

WSL的秘钥被修改了要怎么弄

WSL的秘钥被修改了要怎么弄 gitgithub.com: Permission denied (publickey).ssh-add -l但是我是想加到github上的guiaguaide1.github.com里面哎&#xff0c;为什么这个是shengyi gitgithub.com: Permission denied (publickey). git push -u origin报错 aaaASUS:~/ML/paper/A…

kibana监控

采取方式 Elastic Agent &#xff1a;更完善的功能 Metricbeat&#xff1a;轻量级指标收集&#xff08;采用&#xff09; 传统收集方法&#xff1a;使用内部导出器收集指标&#xff0c;已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…

基于Jenkins实现接口自动化持续集成

一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程 3、源码管理 需要将脚本推送到远程仓库中 4、构建触发器 可以选择定时构建和轮询SCM 定时构建&#xff1a;根据设置的定时时间&#xff0c;自动执行定…

c++系列之vector类模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 构造函数 vector() //_begin表示有效成员的开始 //_finish表示有效成员的大小…

python实现批量pdf转txt和word

文章目录 背景需求环境安装完整代码效果 背景需求 已经获取到了大量的pdf在download文件夹中&#xff0c;但是我需要的是txt文件和word文件&#xff5e; 环境安装 pip install pdf2docx pdfminer.six完整代码 # pip install pdf2docx pdfminer.siximport os from pdf2docx …

idea 基础设置

1、设置 IDEA 主题 2、自动导包和优化多余的包 3、同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;导包合并为* 4、显示行号 &#xff0c; 方法和方法间的分隔符&#xff1a; 5、忽略大小写&#xff0c;进行提示 6、多个类不隐藏&#xff0c;多行显示 7、设置默认的…

面试题 05.01. 插入

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 05.01. 插入 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 截取 N 第 j 位到 31 位&#xff0c;M 低 j-i1 位&#xff0c;N 低 i 位&#xff0c;拼接即可。 解题代码&#xff1a;…