You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用win32gui在指定窗口顶层绘制像素,解决像素无法显示在Chrome上方的问题

实现向指定窗口/全局顶层绘制像素的解决方案

原代码无法生效的原因

  • 直接向目标窗口DC绘制的GDI内容,会在目标窗口自身重绘时被覆盖,无法持久显示
  • Chrome、UWP等非原生GDI渲染的应用,不会将你写入窗口DC的GDI内容合成到最终画面,所以完全看不到绘制结果
  • 系统DWM窗口合成逻辑中,第三方进程写入的GDI内容优先级低于窗口自身渲染内容,会被直接覆盖

标准实现方案

采用透明顶层悬浮窗方案实现绘制,这是Windows平台做全局/窗口级覆盖层的通用方案:

  1. 创建一个无边框、分层透明、始终置顶的窗口,全局绘制的话就让窗口覆盖整个屏幕,绑定指定窗口的话就让窗口大小位置和目标窗口完全同步
  2. 开启悬浮窗的鼠标穿透属性,避免遮挡下层窗口的正常操作
  3. 所有绘制操作都在你自己创建的悬浮窗上执行,因为悬浮窗层级最高,绘制内容会始终显示在最上层

可运行实现代码

首先安装依赖:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 07:27:01