繁体   English   中英

Python win32api获取Windows的“堆栈”

[英]Python win32api get “stack” of windows

我正在寻找一种方法来找出在我的桌面上打开了哪些订单窗口,以便告诉用户哪些窗口可见。

说,按顺序,我打开一个最大化的chrome窗口,一个最大化的notepad ++窗口,然后打开一个仅覆盖屏幕一小部分的命令提示符。 有没有一种使用win32api(或可能的其他库)的方法可以告诉我打开的窗口堆栈,以便我可以确定窗口尺寸并找出可见的内容? 我已经知道如何获取具有焦点的窗口和顶级窗口,但是我正在寻找更多的信息。

在上面提到的示例中,我将返回完整的命令提示符可见,但在不可见的地方,例如,notepad ++窗口可见。 chrome窗口的任何部分都不可见。

import win32gui
import win32con

def get_windows():
    def sort_windows(windows):
        sorted_windows = []

        # Find the first entry
        for window in windows:
            if window["hwnd_above"] == 0:
                sorted_windows.append(window)
                break
        else:
            raise(IndexError("Could not find first entry"))

        # Follow the trail
        while True:
            for window in windows:
                if sorted_windows[-1]["hwnd"] == window["hwnd_above"]:
                    sorted_windows.append(window)
                    break
            else:
                break

        # Remove hwnd_above
        for window in windows:
            del(window["hwnd_above"])

        return sorted_windows

    def enum_handler(hwnd, results):
        window_placement = win32gui.GetWindowPlacement(hwnd)
        results.append({
            "hwnd":hwnd,
            "hwnd_above":win32gui.GetWindow(hwnd, win32con.GW_HWNDPREV), # Window handle to above window
            "title":win32gui.GetWindowText(hwnd),
            "visible":win32gui.IsWindowVisible(hwnd) == 1,
            "minimized":window_placement[1] == win32con.SW_SHOWMINIMIZED,
            "maximized":window_placement[1] == win32con.SW_SHOWMAXIMIZED,
            "rectangle":win32gui.GetWindowRect(hwnd) #(left, top, right, bottom)
        })

    enumerated_windows = []
    win32gui.EnumWindows(enum_handler, enumerated_windows)
    return sort_windows(enumerated_windows)

if __name__ == "__main__":
    windows = get_windows()

    for window in windows:
        print(window)
    print()

    # Pretty print
    for window in windows:
        if window["title"] == "" or not window["visible"]:
            continue
        print(window)

Microsoft MSDN使用GetWindow()和GW_HWNDNEXT https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms633515(v=vs.85).aspx在zorder信息方面有很好的技巧

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM