如何解决过滤后台进程PyWin32
我一直在努力从EnumWindows中筛选出仅包含最小化或打开列表的窗口。
代码
def winEnumHandler(hwnd,ctx):
title = win32gui.GetWindowText(hwnd)
# Append HWND to list
if win32gui.IsWindowVisible(hwnd) and title != '':
app = ApplicationWindow(hwnd,title)
applications.append(app)
def scanApplication():
applications.clear()
win32gui.EnumWindows(winEnumHandler,None)
return applications
预期/实际
此代码的问题是它不能正确过滤掉通过EnumWindows
找到的某些窗口。例如,当前我的计算机上已打开:Chrome,IDE和Discord,并且只希望它们在应用程序列表中。但是,我不仅获得了这些窗口,而且还获得了后台任务,例如:计算器,邮件,Geforce叠加层等。这些后台任务处于活动状态,但桌面上没有窗口,也没有将这些窗口最小化。我如何能够从EnumWindows
中过滤出后台任务?感谢您的阅读!
解决方法
做完更多研究后,我遇到了DWM,DWM提供了一种方法,您可以查找窗口的属性以从中获取更多信息。这些选项之一称为“斗篷”,在从所有窗口中滤除后台进程方面做得很好。我的代码如下。我还将链接有关DWMA的更详细的stackoverflow帖子。
def winEnumHandler(hwnd,ctx):
# DWM
isCloacked = ctypes.c_int(0)
ctypes.WinDLL("dwmapi").DwmGetWindowAttribute(hwnd,14,ctypes.byref(isCloacked),ctypes.sizeof(isCloacked))
# Variables
title = win32gui.GetWindowText(hwnd)
# Append HWND to list
if win32gui.IsWindowVisible(hwnd) and title != '' and isCloacked.value == 0:
app = ApplicationWindow(hwnd,title)
applications.append(app)
DWM过滤:Here
在该链接中还有更多内容,此最终解决方案显示了所有真实的窗口:
class TITLEBARINFO(ctypes.Structure):
_fields_ = [("cbSize",ctypes.wintypes.DWORD),("rcTitleBar",ctypes.wintypes.RECT),("rgstate",ctypes.wintypes.DWORD * 6)]
def winEnumHandler(hwnd,ctx):
# Title Info Initialization
title_info = TITLEBARINFO()
title_info.cbSize = ctypes.sizeof(title_info)
ctypes.windll.user32.GetTitleBarInfo(hwnd,ctypes.byref(title_info))
# DWM Cloaked Check
isCloaked = ctypes.c_int(0)
ctypes.WinDLL("dwmapi").DwmGetWindowAttribute(hwnd,ctypes.byref(isCloaked),ctypes.sizeof(isCloaked))
# Variables
title = wg.GetWindowText(hwnd)
# Append HWND to list
if wg.IsWindowVisible(hwnd) and title != '' and isCloaked.value == 0:
if not (title_info.rgstate[0] & wc.STATE_SYSTEM_INVISIBLE):
app = ApplicationWindow(hwnd,title)
applications.append(app)
任何简化请让我知道!谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。