窗口声称是可见的,而不是

时间:2015-07-14 08:58:30

标签: python winapi process pywin32

我正在运行以下脚本,以确定某个进程是否有任何可见的窗口:

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

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

taskbar

enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:3)

IsWindowVisible返回True并不意味着您将能够在屏幕上看到一个窗口。例如,窗口可以最小化。因此,您可能需要检查窗口是否可见,并且在非常轻松的情况下不会最小化。使用win32gui.IsIconic()测试最小化的窗口。

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

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

我认为此代码更符合您的需求:

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))

但是,这仍然会枚举所有顶级窗口。我认为你真正想要的是Outlook主窗口。我怀疑你需要找到一些方法来识别那个窗口。