我正在运行以下脚本,以确定某个进程是否有任何可见的窗口:
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肯定是不可见的(虽然它在通知图标区域中可见)
答案 0 :(得分:3)
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主窗口。我怀疑你需要找到一些方法来识别那个窗口。