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

如何用Python实现Windows系统下类似Win+D的隐藏窗口显示桌面功能(排除系统核心窗口)

如何用Python实现Windows系统下类似Win+D的隐藏窗口显示桌面功能(排除系统核心窗口)

我完全理解你的需求——不想用pyautogui模拟Win+D按键,而是想通过直接控制窗口来精准最小化用户打开的应用,同时避开那些系统核心窗口(比如桌面管理器、Cortana这类)。你遇到的问题确实很常见:pygetwindow的is_system属性没法完全准确过滤掉所有系统窗口,导致返回的列表里混了一堆不该处理的窗口。

下面给你两种可行的解决思路,从简单改进到更精准的方案:

方案一:优化pygetwindow的过滤逻辑

既然is_system不够靠谱,我们可以结合更多条件来筛选窗口,比如排除已知的系统窗口标题、只处理可见且非最小化的窗口、过滤空标题的后台窗口。修改你的代码如下:

import time
import pygetwindow as gw

def hide():
    windows = gw.getAllWindows()
    # 手动添加需要排除的系统窗口标题(可根据你的系统版本调整)
    excluded_system_titles = ["Windows Program Manager", "Cortana"]
    for window in windows:
        # 组合过滤条件:非系统窗口 + 标题不在排除列表 + 窗口可见 + 未最小化 + 有有效标题
        if (not window.is_system 
            and window.title not in excluded_system_titles 
            and window.isVisible 
            and not window.isMinimized 
            and window.title.strip() != ""):
            window.minimize()
    time.sleep(3)
    return True

print(hide())
print(gw.getAllTitles())

这个方法能过滤掉大部分常见的系统窗口,但缺点是不同Windows版本的系统窗口标题可能有差异,如果遇到漏网的系统窗口,你可以把它的标题添加到excluded_system_titles列表里。

方案二:用pywin32直接调用Windows API(更可靠)

如果想要更精准的控制,推荐使用pywin32库,它能直接调用Windows原生API,通过窗口类名(比标题更稳定)来区分系统窗口和用户窗口。

首先安装库:

pip install pywin32

然后使用以下代码:

import win32gui
import win32con

def is_user_window(hwnd):
    """判断一个窗口是否是需要处理的用户应用窗口"""
    # 1. 窗口必须可见
    if not win32gui.IsWindowVisible(hwnd):
        return False
    # 2. 窗口未处于最小化状态
    if win32gui.IsIconic(hwnd):
        return False
    # 3. 排除系统窗口的类名(这些类名是Windows固定的)
    excluded_class_names = [
        "Progman",          # 桌面窗口
        "Shell_TrayWnd",    # 任务栏
        "CortanaUI",        # Cortana窗口
        "Windows.UI.Core.CoreWindow"  # UWP应用的系统框架窗口
    ]
    window_class = win32gui.GetClassName(hwnd)
    if window_class in excluded_class_names:
        return False
    # 4. 排除无标题的后台窗口
    window_title = win32gui.GetWindowText(hwnd)
    if not window_title.strip():
        return False
    return True

def hide_all_user_windows():
    """枚举所有窗口,最小化符合条件的用户窗口"""
    def window_callback(hwnd, extra_args):
        if is_user_window(hwnd):
            # 发送最小化窗口的指令
            win32gui.ShowWindow(hwnd, win32con.SW_MINIMIZE)
    
    # 遍历系统中所有窗口
    win32gui.EnumWindows(window_callback, None)
    return True

print(hide_all_user_windows())

方案二的优势:

  • 系统窗口的类名是固定的,比标题更稳定,不会因为系统语言、版本变化失效
  • 能更精准地判断窗口状态,避免误处理系统核心组件
  • 如果遇到其他需要排除的系统窗口,你可以用以下代码查看它的类名和标题,添加到排除列表:
    def print_window_info(hwnd, extra):
        print(f"标题: {win32gui.GetWindowText(hwnd)}, 类名: {win32gui.GetClassName(hwnd)}")
    
    win32gui.EnumWindows(print_window_info, None)
    

备注:内容来源于stack exchange,提问作者Coding Genius

火山引擎 最新活动