窗口声称可见,但实际上不是

4

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

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 明显是不可见的(尽管在通知图标区域中可见)。
1个回答

4
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主窗口。我怀疑你需要找到某种方式来识别该窗口。


Outlook应用程序没有任务栏按钮。您看到的是启动Outlook的固定项目。 - IInspectable
@IInspectable 哦,好的,我误解了这张图片。我会更新的。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接