如何从matplotlib图形对象唯一获取win32gui窗口句柄
如何通过Matplotlib Figure对象唯一获取Win32GUI窗口句柄
现有方法的局限性
目前可通过窗口标题结合win32gui.FindWindow()获取窗口句柄,但当存在多个同标题窗口时,该方法仅返回第一个匹配结果,无法精准定位到指定的Matplotlib Figure窗口,示例如下:
单一窗口场景(有效)
import matplotlib.pyplot as plt import win32gui fig = plt.figure() my_title = 'My Figure' fig.canvas.manager.window.title(my_title) hdl = win32gui.FindWindow(None, my_title) print(hdl) # 输出示例:7735822
多同标题窗口场景(失效)
fig1 = plt.figure() fig2 = plt.figure() my_title = 'My Figure' fig1.canvas.manager.window.title(my_title) fig2.canvas.manager.window.title(my_title) # 两个窗口标题相同 hdl = win32gui.FindWindow(None, my_title) print(hdl) # 仅返回第一个匹配的句柄,无法获取第二个窗口的句柄
直接通过Figure对象获取唯一句柄
Matplotlib的不同后端(Qt/Tk/Wx)对应不同的原生窗口对象,可通过fig.canvas.manager.window获取原生窗口实例,再从中提取窗口句柄:
Qt后端(Qt5Agg/Qt6Agg,多数环境默认)
import matplotlib.pyplot as plt import win32gui fig = plt.figure() # 获取Qt窗口的winId,转换为整数即为Win32句柄 hdl = int(fig.canvas.manager.window.winId()) print(hdl)
Tk后端(TkAgg)
import matplotlib.pyplot as plt import win32gui plt.switch_backend('TkAgg') fig = plt.figure() # Tk窗口的winfo_id()直接返回Win32句柄 hdl = fig.canvas.manager.window.winfo_id() print(hdl)
Wx后端(WxAgg)
import matplotlib.pyplot as plt import win32gui plt.switch_backend('WxAgg') fig = plt.figure() # Wx窗口的GetHandle()方法返回Win32句柄 hdl = fig.canvas.manager.window.GetHandle() print(hdl)
获取所有同标题窗口的句柄列表
如果需要获取所有匹配指定标题的窗口句柄,可通过win32gui.EnumWindows()枚举所有顶层窗口并筛选:
import win32gui import win32con def get_all_matching_windows(title): handles = [] def enum_callback(handle, extra): # 匹配标题,且仅统计可见的顶层窗口 if (win32gui.GetWindowText(handle) == extra['title'] and win32gui.IsWindowVisible(handle) and win32gui.GetWindowLong(handle, win32con.GWL_STYLE) & win32con.WS_OVERLAPPEDWINDOW): handles.append(handle) return True win32gui.EnumWindows(enum_callback, {'title': title}) return handles # 使用示例 fig1 = plt.figure() fig2 = plt.figure() my_title = 'My Figure' fig1.canvas.manager.window.title(my_title) fig2.canvas.manager.window.title(my_title) all_handles = get_all_matching_windows(my_title) print(all_handles) # 返回所有匹配标题的窗口句柄列表
内容的提问来源于stack exchange,提问作者Martí
相关产品推荐
相关产品推荐

