Python:简单'如果'声明告诉您用户是否没有最大化窗口

时间:2014-08-19 21:29:18

标签: python user-interface tkinter desktop tk

我有一些tkinter代码,当用户在桌面上没有最大化窗口时应该提升窗口。什么代码告诉我用户是否在他们的桌面上?(最好没有win32,但如果是这样,请留下一些安装指示)

if #user is on desktop# == True or etc.:
    root.lift()

1 个答案:

答案 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()

归功于MSDNJohannes Sasongok