You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用BitBlt()捕获资源管理器窗口时标题栏变黑且位置偏移的问题求助

BitBlt()捕获资源管理器窗口时标题栏变黑且位置偏移的问题求助

我现在尝试通过HWND来捕获窗口画面,比如我的资源管理器窗口:
(正常显示的资源管理器界面截图)

但实际捕获得到的结果却是这样:
(标题栏变黑、画面存在位置偏移的捕获结果截图)

我使用的捕获函数如下:

import win32gui
import win32ui
import win32con
import time
from PIL import Image
import cv2
import numpy as np

def capture_window(hwnd):
    win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
    win32gui.SetForegroundWindow(hwnd)
    time.sleep(1)

    window_dc = win32gui.GetWindowDC(hwnd)
    dc_object = win32ui.CreateDCFromHandle(window_dc)
    compatible_dc = dc_object.CreateCompatibleDC()

    left, top, right, bottom = win32gui.GetClientRect(hwnd)
    width = right - left
    height = bottom - top

    bitmap = win32ui.CreateBitmap()
    bitmap.CreateCompatibleBitmap(dc_object, width, height)
    compatible_dc.SelectObject(bitmap)

    compatible_dc.BitBlt((0, 0), (width, height), dc_object, (0, 0), win32con.SRCCOPY)

    bmpinfo = bitmap.GetInfo()
    bmpstr = bitmap.GetBitmapBits(True)
    img = Image.frombuffer(
        "RGB", (bmpinfo["bmWidth"], bmpinfo["bmHeight"]), bmpstr, "raw", "BGRX", 0, 1
    )

    img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)

    win32gui.DeleteObject(bitmap.GetHandle())
    compatible_dc.DeleteDC()
    dc_object.DeleteDC()
    win32gui.ReleaseDC(hwnd, window_dc)

    return img

现在遇到的问题是,捕获的画面标题栏变黑,而且画面位置还有偏移。有些窗口能正常捕获,但像资源管理器这类窗口就会出现这个问题。

我试过把代码里的win32gui.GetClientRect()改成win32gui.GetWindowRect(),但并没有解决问题。我期望能捕获到和窗口实际显示完全一致的画面,请问这个问题是什么原因导致的?该怎么解决?

备注:内容来源于stack exchange,提问作者王常友

火山引擎 最新活动