用Python Windows扩展获取窗口Z顺序

7 投票
1 回答
2702 浏览
提问于 2025-04-16 19:45

有没有办法通过Python Windows 扩展来获取窗口的层级顺序(z-order)?或者说,是否可以用其他模块来实现这个功能?通常我们会用GetTopWindowGetNextWindow这两个函数来完成,但在win32gui模块里找不到这两个函数。

现在我正在这样做,但这并没有考虑到窗口的层级顺序:

import win32gui
def get_windows():
    def callback(hwnd, lst):
        lst.append(hwnd)
    lst = []
    win32gui.EnumWindows(callback, lst)
    return lst

理想情况下,我希望能有这样的功能:(这个方法不行)

import win32gui
import win32con
def get_windows():
    '''Returns windows in z-order (top first)'''
    lst = []
    top = win32gui.GetTopWindow()
    if top is None: return lst
    lst.append(top)
    while True:
        next = win32gui.GetNextWindow(lst[-1], win32con.GW_HWNDNEXT)
        if next is None: break
        lst.append(next)
    return lst

不过,GetTopWindowGetNextWindow这两个函数缺失了,所以我无法实现。

更新:

我想我有点太急于寻求帮助了。其实我用ctypes解决了这个问题。希望其他人也能觉得这个信息有用。

import win32con
import ctypes
def get_windows():
    '''Returns windows in z-order (top first)'''
    user32 = ctypes.windll.user32
    lst = []
    top = user32.GetTopWindow(None)
    if not top:
        return lst
    lst.append(top)
    while True:
        next = user32.GetWindow(lst[-1], win32con.GW_HWNDNEXT)
        if not next:
            break
        lst.append(next)
    return lst

1 个回答

0

关于“死贴”的话题。

PyWin32的当前链接是:[GitHub]: mhammond/pywin32 - pywin32

关于CTypes的替代方案:

关于PyWin32的实现,假设它没有错误(我没有检查):

  • [MS.Docs]: GetNextWindow宏(winuser.h)(正如URL文本所说),是一个#define,而不是一个函数,这个事实在提问时就已经知道了(因为CTypes的实现使用的是后者),所以可以使用win32gui.GetWindow(至少在最新的PyWin32版本中可以使用)。

  • 我刚刚提交了[GitHub]: mhammond/pywin32 - 在win32gui中添加更多窗口函数(在220822合并到main分支)。可以查看[SO]: 如何使用python和win32print更改打印队列中作业的用户名(@CristiFati的回答)了解如何利用这样的补丁。
    本地构建示例:

    [cfati@CFATI-5510-0:e:\Work\Dev\GitHub\CristiFati\pywin32\src\build\lib.win-amd64-3.9\win32]> "e:\Work\Dev\VEnvs\py_pc064_03.09_test0\Scripts\python.exe" -c "import os;os.add_dll_directory(os.path.join(os.path.dirname(os.getcwd()), 'pywin32_system32'));import win32gui as wgui;print(wgui);print('Top window handle: 0x{:016X}'.format(wgui.GetTopWindow(None)))"
    <module 'win32gui' from 'e:\\Work\\Dev\\GitHub\\CristiFati\\pywin32\\src\\build\\lib.win-amd64-3.9\\win32\\win32gui.pyd'>
    Top window handle: 0x0000000000020480
    

撰写回答