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

Python3.7下不使用win32api获取任务栏高度的方法

解决方案

1. 简化屏幕尺寸获取逻辑

你当前通过字符串拆分提取屏幕宽高的方式过于繁琐,pyautogui.size() 返回的 Size 对象支持直接属性访问:

winSize = pyautogui.size()
screen_width = winSize.width
screen_height = winSize.height

2. 用标准库ctypes获取排除任务栏的工作区尺寸

无需依赖第三方win32api,Python自带的ctypes可以直接调用Windows系统API,获取系统工作区(即屏幕减去任务栏后的可用区域):

import ctypes

user32 = ctypes.windll.user32
work_area = ctypes.wintypes.RECT()
user32.GetWindowRect(user32.GetDesktopWindow(), ctypes.byref(work_area))
# 计算工作区的宽高
work_width = work_area.right - work_area.left
work_height = work_area.bottom - work_area.top

3. 修改后的完整代码

整合上述逻辑后的最终代码如下:

import pyautogui
import customtkinter
import ctypes

customtkinter.set_appearance_mode("dark")
customtkinter.set_default_color_theme("dark-blue")

root = customtkinter.CTk()
root.title('custom title bar')

# 获取排除任务栏的工作区尺寸
user32 = ctypes.windll.user32
work_area = ctypes.wintypes.RECT()
user32.GetWindowRect(user32.GetDesktopWindow(), ctypes.byref(work_area))
work_width = work_area.right - work_area.left
work_height = work_area.bottom - work_area.top

# 设置窗口为工作区大小,定位到屏幕左上角
root.geometry(f"{work_width}x{work_height}+0+0")

# 移除默认标题栏
root.overrideredirect(True)

# 创建自定义标题栏
title_bar = customtkinter.CTkFrame(master=root, corner_radius=0)
title_bar.pack(fill="x")

# 标题栏文本
title_label = customtkinter.CTkLabel(master=title_bar, text="custom title bar")
title_label.pack(pady=2, padx=10, side='left')

# 关闭按钮
close = customtkinter.CTkButton(master=title_bar, text="X", fg_color="#202020", hover_color="#ff1c1c", width=30, corner_radius=0, command=root.quit)
close.pack(pady=0, padx=0, side='right')

root.mainloop()

补充说明

  • ctypes是Python标准库,无需额外安装,完全兼容Python3.7及以上版本
  • GetWindowRect(user32.GetDesktopWindow()) 会自动识别系统任务栏的位置和高度,返回的工作区区域不会被任务栏覆盖
  • 调整了标题栏布局,让其自动填充窗口宽度(fill="x"),避免固定宽度导致的适配问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:55:20