我有一些tkinter代码,当用户在桌面上没有最大化窗口时应该提升窗口。什么代码告诉我用户是否在他们的桌面上?(最好没有win32,但如果是这样,请留下一些安装指示)
if #user is on desktop# == True or etc.:
root.lift()
答案 0 :(得分:0)
您可以使用ctypes
执行此操作。首先,我们应该了解一些Windll.User32
函数:
EnumWindows
- 通过将句柄依次传递给应用程序定义的回调函数,枚举屏幕上的所有顶级窗口。
IsWindowVisible
- 确定指定窗口的可见性状态。
IsZoomed
- 确定窗口是否已最大化。
GetForgroundWindow
- 检索前台窗口的句柄(用户当前正在使用的窗口)。
GetShellWindow
- 返回值是Shell桌面窗口的句柄。如果不存在Shell进程,则返回值为NULL。
首先要导入ctypes
:
import ctypes
然后设置我们需要从user32 dll调用的函数:
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
IsWindowVisible = ctypes.windll.user32.IsWindowVisible
IsZoomed = ctypes.windll.user32.IsZoomed
GetForegroundWindow = ctypes.windll.user32.GetForegroundWindow
GetShellWindow = ctypes.windll.user32.GetShellWindow
然后我们可以定义一个方法来检查没有最大化的窗口,并且用户在桌面上是这样的:
def desktop_active():
MAX_WINDOWS = [] # Use this to store if any windows are maximised
def foreach_window(hwnd, lParam): #Callback function for Enumwindows etc
if IsWindowVisible(hwnd):
MAX_WINDOWS.append(IsZoomed(hwnd))
EnumWindows(EnumWindowsProc(foreach_window), 0)
if any(MAX_WINDOWS):
return False
if GetShellWindow() == GetForegroundWindow():
return True # If we have no windows max'd and the forground is the desktop
然后,您可以按要求在代码中使用该函数:
if desktop_active():
root.lift()