📜  python 获取所有打开窗口的列表 - Python (1)

📅  最后修改于: 2023-12-03 14:46:18.152000             🧑  作者: Mango

Python获取所有打开窗口的列表

在Python中,需要获取当前计算机屏幕上所有打开的窗口列表时,可以使用pyautoguiwin32gui库。

pyautogui

pyautogui是一个Python自动化工具库,其中包含了获取UI界面信息的函数pyautogui.getAllWindows()。这个函数返回了一个列表,其中包含了当前计算机屏幕上所有打开的窗口句柄(handle),可以通过句柄(handle)获取窗口的其他信息。下面是使用pyautogui获取当前计算机屏幕上所有打开窗口句柄的示例代码:

import pyautogui

# 获取所有窗口句柄
windows = pyautogui.getAllWindows()
print(windows)

其中,pyautogui.getAllWindows()返回的列表中每个元素都是一个整数类型(即窗口句柄),下面讲解如何利用这些句柄获取窗口的其他信息。

win32gui

win32gui是Python的一个第三方库,用于调用Windows系统的GUI API。利用这个库,可以获取属于Windows窗口的所有信息,常见的窗口信息包括窗口的位置、大小、标题等。下面是使用win32gui获取窗口信息的示例代码:

import win32gui

# 通过窗口句柄获取窗口标题和位置信息
for handle in windows:
    title = win32gui.GetWindowText(handle)
    rect = win32gui.GetWindowRect(handle)
    print(title, rect)

其中,win32gui.GetWindowText(handle)可以获取窗口的标题信息。win32gui.GetWindowRect(handle)可以获取窗口的位置信息,它返回了一个矩形元组,元组中分别存放了矩形的左上角坐标和右下角坐标。

注意事项
  1. 在使用pyautogui.getAllWindows()获取窗口句柄时,可能会获取到非窗口句柄(例如托盘),需要通过一些方法进行过滤。一个常用的方法是判断窗口大小是否为零,代码如下:

    # 过滤掉大小为0的窗口
    windows = [handle for handle in windows if win32gui.IsWindowVisible(handle) and win32gui.GetWindowText(handle) != '' and win32gui.GetWindowRect(handle).width != 0]
    
  2. 在使用win32gui.GetWindowText(handle)获取窗口标题时,可能会遇到乱码问题,这是因为某些窗口的标题编码方式是GBK或其他编码方式。为了避免这种情况,需要进行编码转换。一个常用的方法是使用ctypes库的windll.kernel32.MultiByteToWideChar()函数进行转换,代码如下:

    import ctypes
    
    # 将字符串从GBK编码转换为unicode编码
    def convert_to_unicode(text):
        buf_size = len(text) * 2
        buf = ctypes.create_unicode_buffer(buf_size)
        ctypes.windll.kernel32.MultiByteToWideChar(936, 0, text, -1, buf, buf_size)
        return buf.value
    
总结

本文介绍了如何使用pyautoguiwin32gui库获取当前计算机屏幕上所有打开的窗口列表。通过获取窗口句柄和窗口信息,可以实现一些基本的自动化操作,例如点击窗口、调整窗口位置和大小等。需要注意的是,在实际应用时需要根据实际情况进行过滤和编码转换等处理。