Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 窗口声称是可见的,而它';不是_Python_Winapi_Process_Pywin32 - Fatal编程技术网

Python 窗口声称是可见的,而它';不是

Python 窗口声称是可见的,而它';不是,python,winapi,process,pywin32,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.GetWindowT

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

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"
由于某些原因,它打印的
窗口可见

但是,这就是我的任务栏和任务管理器的外观:

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


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

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

你的代码看起来也很奇怪。将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的固定项目。@I不可检测啊,好吧,我误解了图像。我会更新的。