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

如何在其他程序运行时截取包含图标的完整桌面截图?

前台有程序运行时截取含所有桌面图标的截图

一、当前方案的说明与优化

你现在用Win+D切换显示桌面再截图的思路可行,但依赖固定延迟的time.sleep(1)不够可靠——不同机器响应速度不同,可能导致截图时机偏差。可以做以下优化:

优化后的代码

import cv2 as cv
import pyautogui
import numpy as np
import win32gui
import win32con
import time

# 最小化所有窗口(替代Win+D,更稳定)
def minimize_all_windows():
    hwnd = win32gui.GetDesktopWindow()
    win32gui.SendMessage(hwnd, win32con.WM_COMMAND, win32con.SYSCOMMAND_MINIMIZEALL, 0)

# 恢复所有窗口
def restore_all_windows():
    hwnd = win32gui.GetDesktopWindow()
    win32gui.SendMessage(hwnd, win32con.WM_COMMAND, win32con.SYSCOMMAND_RESTOREALL, 0)

minimize_all_windows()
# 等待桌面稳定,可替换为检查桌面是否激活的逻辑进一步优化
time.sleep(0.5)

screenshot = pyautogui.screenshot()
screenshot = cv.cvtColor(np.array(screenshot), cv.COLOR_RGB2BGR)

restore_all_windows()

cv.imshow('Screenshot', screenshot)
cv.waitKey(0)
cv.destroyAllWindows()

优化点说明

  • 用Windows API的SendMessage发送最小化/恢复指令,比快捷键更稳定,不会因焦点问题失效
  • 可进一步替换固定延迟为循环检查:判断当前前台窗口是否为桌面窗口,确认激活后再截图,彻底消除延迟误差

二、修改窗口透明度的实现思路

如果不想切换窗口状态,可通过修改前台窗口的透明度让桌面图标“透出来”,具体实现如下:

实现代码

import cv2 as cv
import pyautogui
import numpy as np
import win32gui
import win32con
import time

# 获取前台窗口句柄
foreground_hwnd = win32gui.GetForegroundWindow()
# 保存窗口原有样式和透明度
original_exstyle = win32gui.GetWindowLong(foreground_hwnd, win32con.GWL_EXSTYLE)
original_alpha = win32gui.GetWindowLong(foreground_hwnd, win32con.GWL_ALPHA) if (original_exstyle & win32con.WS_EX_LAYERED) else 255

try:
    # 设置窗口为分层样式并设为完全透明
    win32gui.SetWindowLong(foreground_hwnd, win32con.GWL_EXSTYLE, original_exstyle | win32con.WS_EX_LAYERED)
    win32gui.SetLayeredWindowAttributes(foreground_hwnd, 0, 0, win32con.LWA_ALPHA)
    
    # 等待透明度生效
    time.sleep(0.1)
    
    # 截取全屏
    screenshot = pyautogui.screenshot()
    screenshot = cv.cvtColor(np.array(screenshot), cv.COLOR_RGB2BGR)
finally:
    # 恢复窗口原有状态
    win32gui.SetWindowLong(foreground_hwnd, win32con.GWL_EXSTYLE, original_exstyle)
    if original_exstyle & win32con.WS_EX_LAYERED:
        win32gui.SetLayeredWindowAttributes(foreground_hwnd, 0, original_alpha, win32con.LWA_ALPHA)

cv.imshow('Screenshot', screenshot)
cv.waitKey(0)
cv.destroyAllWindows()

注意事项

  • 需要先安装pywin32库:pip install pywin32
  • 部分程序不支持分层窗口样式,修改透明度可能无效,这种情况优先用第一种方案
  • 用try...finally确保无论截图是否成功,都能恢复窗口原有状态,避免窗口一直透明

内容的提问来源于stack exchange,提问作者Trinity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:22:16