Window 声称可见,但实际不可见
Window claims to be visible, while it's not
我正在 运行 跟踪脚本以查明某些进程是否有任何可见的 windows:
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肯定是不可见的(虽然它在通知图标区域是可见的)
那个IsWindowVisible
returnsTrue
并不意味着你就能在屏幕上看到一个window。例如,可以将 window 最小化。因此,您可能需要检查 window 是否可见并且非常容易地没有最小化。使用 win32gui.IsIconic()
测试正在最小化的 window。
也完全有可能 Outlook 有多个顶级 windows,正如您在上一个问题中所述。您的方法将检测这些 windows 中的任何一个是否具有可见的 属性.
您的代码看起来也很奇怪。将 PID 传递给名为 WindowIsVisible
的函数对我来说感觉不对。这是您会问 window 而不是流程的问题。
我认为这段代码更适合您的需要:
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))
但是,这仍然会枚举所有顶级windows。我认为您真正需要的是 Outlook 主 window。我怀疑您需要找到一些方法来识别 window.
我正在 运行 跟踪脚本以查明某些进程是否有任何可见的 windows:
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肯定是不可见的(虽然它在通知图标区域是可见的)
那个IsWindowVisible
returnsTrue
并不意味着你就能在屏幕上看到一个window。例如,可以将 window 最小化。因此,您可能需要检查 window 是否可见并且非常容易地没有最小化。使用 win32gui.IsIconic()
测试正在最小化的 window。
也完全有可能 Outlook 有多个顶级 windows,正如您在上一个问题中所述。您的方法将检测这些 windows 中的任何一个是否具有可见的 属性.
您的代码看起来也很奇怪。将 PID 传递给名为 WindowIsVisible
的函数对我来说感觉不对。这是您会问 window 而不是流程的问题。
我认为这段代码更适合您的需要:
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))
但是,这仍然会枚举所有顶级windows。我认为您真正需要的是 Outlook 主 window。我怀疑您需要找到一些方法来识别 window.