仅当有更新时,如何使用 GDI 读取 Windows 屏幕部分?
Posted
技术标签:
【中文标题】仅当有更新时,如何使用 GDI 读取 Windows 屏幕部分?【英文标题】:How to read a windows screen portion using GDI, only when there is an update? 【发布时间】:2017-12-20 07:14:07 【问题描述】:我正在尝试使用 GDI 和 python API 读取多个像素。 由于我正在阅读的屏幕部分非常小,在将屏幕复制到内存设备上下文时,我只考虑那个特定部分。
由于我不断轮询,并将新屏幕与旧屏幕进行比较,导致 CPU 使用率过高。 所以我想知道是否有任何有效的方法来仅在屏幕更新时读取屏幕?
【问题讨论】:
最简单的方法是在每次比较后调用 sleep。这样CPU使用率就会急剧下降。每秒进行 50 次比较而不是说 1000 次比较可能就足够了。 @MichaelWalz 因为我们的屏幕不断更新,所以如果我使用睡眠,它可能会错过信息。这就是为什么我正在寻找基于推送的机制。 【参考方案1】:如果您知道您感兴趣的更新操作发生在 WM_PAINT 期间,您可以安装一个 Windows 挂钩(CallWndProc 或 CBTProc 挂钩)并在将 WM_PAINT 分派到感兴趣的窗口后执行您的操作。
【讨论】:
我在另一个进程中有另一个线程,它正在窗口上写入一些数据并调用 update() 函数。而且读取代码独立于写入线程,所以我不确定是否可以尝试您的方法。 @Rahul:那是一个非常糟糕的设计。永远不要尝试从拥有窗口的线程以外的线程进行渲染。几乎任何 GUI 库都是如此。以上是关于仅当有更新时,如何使用 GDI 读取 Windows 屏幕部分?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中获取电池电量变化(仅当有电量/百分比变化时)?
当且仅当有新的提交时,如何在一天中的特定时间构建 XCode 机器人?