使用win32gui在指定窗口顶层绘制像素,解决像素无法显示在Chrome上方的问题
实现向指定窗口/全局顶层绘制像素的解决方案
原代码无法生效的原因
- 直接向目标窗口DC绘制的GDI内容,会在目标窗口自身重绘时被覆盖,无法持久显示
- Chrome、UWP等非原生GDI渲染的应用,不会将你写入窗口DC的GDI内容合成到最终画面,所以完全看不到绘制结果
- 系统DWM窗口合成逻辑中,第三方进程写入的GDI内容优先级低于窗口自身渲染内容,会被直接覆盖
标准实现方案
采用透明顶层悬浮窗方案实现绘制,这是Windows平台做全局/窗口级覆盖层的通用方案:
- 创建一个无边框、分层透明、始终置顶的窗口,全局绘制的话就让窗口覆盖整个屏幕,绑定指定窗口的话就让窗口大小位置和目标窗口完全同步
- 开启悬浮窗的鼠标穿透属性,避免遮挡下层窗口的正常操作
- 所有绘制操作都在你自己创建的悬浮窗上执行,因为悬浮窗层级最高,绘制内容会始终显示在最上层
可运行实现代码
首先安装依赖:
pip install pyqt5 pywin32
全局顶层绘制十字标记的代码示例:
import sys import win32gui import win32con from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QColor from PyQt5.QtCore import Qt, QTimer class OverlayWindow(QWidget): def __init__(self): super().__init__() # 窗口属性配置:无边框、顶层、透明、鼠标穿透 self.setWindowFlags( Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool | Qt.WindowTransparentForInput ) self.setAttribute(Qt.WA_TranslucentBackground) # 覆盖整个屏幕 screen_geo = QApplication.desktop().screenGeometry() self.setGeometry(screen_geo) # 定时刷新绘制 self.timer = QTimer() self.timer.timeout.connect(self.update) self.timer.start(100) # 每100ms刷新一次,和原代码逻辑一致 def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) # 红色画笔,和原代码颜色一致 painter.setPen(QColor(255, 0, 0)) # 屏幕中心坐标,和原代码逻辑一致 center_x = self.width() // 2 center_y = self.height() // 2 # 绘制和原代码一致的十字标记 offsets = [ (0,0), (-1,0), (1,0), (0,-1), (0,1), (-1,-1), (1,1), (-1,1), (1,-1), (-2,0), (2,0), (0,-2), (0,2), (-2,-2), (2,2), (-2,2), (2,-2) ] for dx, dy in offsets: painter.drawPoint(center_x + dx, center_y + dy) if __name__ == "__main__": # 高DPI适配 QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) app = QApplication(sys.argv) overlay = OverlayWindow() overlay.show() sys.exit(app.exec_())
绑定到指定窗口的扩展方法
如果需要将绘制内容固定显示在指定窗口上方,仅需增加以下逻辑:
- 用
win32gui.FindWindow或枚举窗口接口获取目标窗口的句柄 - 新增定时任务,每隔几十毫秒获取目标窗口的位置、大小、是否可见状态,同步调整悬浮窗的位置和大小
- 如果目标窗口最小化/关闭,对应隐藏悬浮窗即可
如果需要绑定到Chrome的指定标签页,可通过枚举Chrome的子窗口找到对应标签页的句柄,再执行上述绑定逻辑即可。
内容的提问来源于stack exchange,提问作者Cahan uuu
相关产品推荐
相关产品推荐

