窗口声称是可见的,而它是n

2024-09-29 21:47:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我运行以下脚本以确定某个进程是否有可见窗口:

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

怎么可能?outlookexe绝对不可见(尽管它在通知图标区域可见)

enter image description here


Tags: import脚本dataifdefwindowpidhas
1条回答
网友
1楼 · 发布于 2024-09-29 21:47:08

IsWindowVisible返回{}并不意味着你可以在屏幕上看到一个窗口。例如,窗口可以最小化。因此,您可能需要检查窗口是否可见,并且至少没有最小化。使用win32gui.IsIconic()测试最小化的窗口。在

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

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

我认为这一准则更适合您的需要:

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主窗口。我想你得想办法找出那扇窗户。在

相关问题 更多 >

    热门问题