Window 声称可见,但实际不可见

Window claims to be visible, while it's not

我正在 运行 跟踪脚本以查明某些进程是否有任何可见的 windows:

import win32gui
import win32process

pid = 6324

def WindowIsVisible(pid):
    data = [pid, False]
    win32gui.EnumWindows(enumHandler, data)
    return data[1]

def enumHandler(hwnd, data):
    if win32process.GetWindowThreadProcessId(hwnd)[1] == data[0] and win32gui.IsWindowVisible(hwnd):
        data[1] = True

if WindowIsVisible(pid):
    print "has visible window"
else:
    print "does not have visible window"

出于某种原因,它打印 has visible window

但是,这是我的任务栏和任务管理器的样子:

这怎么可能? outlook exe肯定是不可见的(虽然它在通知图标区域是可见的)

那个IsWindowVisiblereturnsTrue并不意味着你就能在屏幕上看到一个window。例如,可以将 window 最小化。因此,您可能需要检查 window 是否可见并且非常容易地没有最小化。使用 win32gui.IsIconic() 测试正在最小化的 window。

也完全有可能 Outlook 有多个顶级 windows,正如您在上一个问题中所述。您的方法将检测这些 windows 中的任何一个是否具有可见的 属性.

您的代码看起来也很奇怪。将 PID 传递给名为 WindowIsVisible 的函数对我来说感觉不对。这是您会问 window 而不是流程的问题。

我认为这段代码更适合您的需要:

def topLevelWindows(pid):

    def enumHandler(hwnd, data):
        if win32process.GetWindowThreadProcessId(hwnd)[1] == pid:
            windows.append(hwnd)
        return True

    windows = []
    win32gui.EnumWindows(enumHandler, 0)
    return windows

for hwnd in topLevelWindows(pid):
    if win32gui.IsWindowVisible(hwnd) and not win32gui.IsIconic(hwnd):
        print '%.8x %s' % (hwnd, win32gui.GetWindowText(hwnd))

但是,这仍然会枚举所有顶级windows。我认为您真正需要的是 Outlook 主 window。我怀疑您需要找到一些方法来识别 window.