如何让Tkinter窗口不受Win+D快捷键的最小化影响?
解决Tkinter窗口在Win+D后保持置顶的问题
Tkinter自带的wm_attributes('-topmost', 1)只能保证窗口在其他普通窗口之上,但挡不住Windows的Win+D显示桌面快捷键——这是系统级操作,会最小化所有标准窗口。要绕过这个限制,得借助Windows API来修改窗口的系统属性,让它不被Win+D影响。
下面是具体的实现代码:
import tkinter as tk import ctypes from ctypes import wintypes # 加载Windows用户32位动态链接库 user32 = ctypes.WinDLL('user32', use_last_error=True) # 定义所需的常量 HWND_TOPMOST = -1 SWP_NOMOVE = 0x0002 SWP_NOSIZE = 0x0001 SWP_NOACTIVATE = 0x0010 GWL_EXSTYLE = -20 WS_EX_TOPMOST = 0x00000008 WS_EX_TOOLWINDOW = 0x00000080 # 声明API函数的参数和返回值类型 user32.SetWindowPos.restype = wintypes.BOOL user32.SetWindowPos.argtypes = ( wintypes.HWND, wintypes.HWND, wintypes.INT, wintypes.INT, wintypes.INT, wintypes.INT, wintypes.UINT ) user32.GetWindowLongPtrW.restype = wintypes.LONG_PTR user32.GetWindowLongPtrW.argtypes = (wintypes.HWND, wintypes.INT) user32.SetWindowLongPtrW.restype = wintypes.LONG_PTR user32.SetWindowLongPtrW.argtypes = (wintypes.HWND, wintypes.INT, wintypes.LONG_PTR) # 创建Tkinter窗口 root = tk.Tk() root.title("Win+D免疫置顶窗口") root.geometry("300x200") # 获取窗口句柄 hwnd = wintypes.HWND(root.winfo_id()) # 修改窗口扩展样式:添加工具窗口属性(避免被Win+D最小化)+ 置顶 current_style = user32.GetWindowLongPtrW(hwnd, GWL_EXSTYLE) new_style = current_style | WS_EX_TOPMOST | WS_EX_TOOLWINDOW user32.SetWindowLongPtrW(hwnd, GWL_EXSTYLE, new_style) # 强制设置窗口为置顶状态 user32.SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE ) # 拦截窗口最小化事件,确保不会被隐藏 def block_minimize(event): root.deiconify() return "break" root.bind("<Unmap>", block_minimize) root.mainloop()
关键原理说明:
WS_EX_TOOLWINDOW:这个Windows窗口样式会把你的应用标记为工具窗口,系统的显示桌面操作(Win+D)不会对这类窗口执行最小化。- 结合
WS_EX_TOPMOST和SetWindowPos:双重保障窗口始终处于顶层位置,避免被其他窗口覆盖。 <Unmap>事件绑定:拦截窗口被隐藏的操作,一旦触发就立即恢复窗口显示,防止意外最小化。
注意:这个方案仅适用于Windows系统,因为用到了专属的Windows API。
内容的提问来源于stack exchange,提问作者박제현
相关产品推荐
相关产品推荐

