仅当有更新时,如何使用 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中获取电池电量变化(仅当有电量/百分比变化时)?

有没有办法在 C# 中仅当有东西可供阅读时才轮询套接字?

当且仅当有新的提交时,如何在一天中的特定时间构建 XCode 机器人?

仅当有要展示的特色产品时才包含自定义 slideshow.php

仅当有标头时,Chrome 中的 CORS 请求才会失败

仅当有数据时才呈现表