【问题标题】:Window claims to be visible, while it's not窗口声称是可见的,但它不是
【发布时间】:2023-03-21 03:02:01
【问题描述】:

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

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 绝对是不可见的(虽然它在通知图标区域可见)

【问题讨论】:

    标签: python winapi process pywin32


    【解决方案1】:

    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 啊,好吧,我误解了图像。我会更新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2021-11-12
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多