筛选后台进程PyWin32

2024-05-17 04:03:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直致力于从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中筛选出后台任务?谢谢你的阅读


Tags: 代码app列表titledefctx致力于append
1条回答
网友
1楼 · 发布于 2024-05-17 04:03:45

在对DWM做了更多的研究之后,DWM提供了一种方法,您可以查找windows的属性,从中获得更多信息。其中一个选项称为“斗篷”,它在过滤所有窗口中的后台进程方面做得非常好。我的代码如下。我还将链接更多关于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, 14, 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)

任何简化请让我知道!谢谢

相关问题 更多 >