如何在pyglet中通过编程恢复已最小化的窗口?
如何在pyglet中编程恢复最小化的窗口
目前pyglet官方确实没有提供直接恢复最小化窗口的内置方法,但无需修改源码,通过调用对应平台的原生API即可实现,以下是不同平台的可行方案:
针对单平台的实现
Windows平台
直接利用窗口的原生句柄_hwnd,调用Windows API的ShowWindow函数恢复窗口:
import pyglet import ctypes # 加载user32库并定义常量 user32 = ctypes.WinDLL('user32', use_last_error=True) SW_RESTORE = 9 # 创建窗口并最小化 window = pyglet.window.Window() window.minimize() # 恢复窗口 user32.ShowWindow(window._hwnd, SW_RESTORE) pyglet.app.run()
Linux(X11)平台
通过X11的XMapRaised函数恢复并激活窗口,利用pyglet窗口暴露的_xdisplay和_xwindow句柄:
import pyglet from ctypes import cdll # 加载X11库 xlib = cdll.LoadLibrary('libX11.so.6') window = pyglet.window.Window() window.minimize() # 恢复窗口 xlib.XMapRaised(window._xdisplay, window._xwindow) pyglet.app.run()
macOS平台
调用Quartz框架的API,利用窗口的_ns_window属性(对应NSWindow实例):
import pyglet import ctypes # 加载Quartz框架 quartz = ctypes.CDLL('/System/Library/Frameworks/Quartz.framework/Quartz') window = pyglet.window.Window() window.minimize() # 恢复并激活窗口 quartz.NSWindow_makeKeyAndOrderFront(window._ns_window, None) pyglet.app.run()
跨平台通用封装
可以封装一个跨平台的恢复函数,甚至直接给pyglet.window.Window类动态添加restore方法,避免重复代码:
import pyglet import sys def _restore_win32(window): import ctypes user32 = ctypes.WinDLL('user32', use_last_error=True) user32.ShowWindow(window._hwnd, 9) # SW_RESTORE = 9 def _restore_linux(window): from ctypes import cdll xlib = cdll.LoadLibrary('libX11.so.6') xlib.XMapRaised(window._xdisplay, window._xwindow) def _restore_macos(window): import ctypes quartz = ctypes.CDLL('/System/Library/Frameworks/Quartz.framework/Quartz') quartz.NSWindow_makeKeyAndOrderFront(window._ns_window, None) def restore_window(window): platform = sys.platform if platform == 'win32': _restore_win32(window) elif platform.startswith('linux'): _restore_linux(window) elif platform == 'darwin': _restore_macos(window) # 给Window类添加restore方法 pyglet.window.Window.restore = lambda self: restore_window(self) # 使用示例 window = pyglet.window.Window() window.minimize() window.restore() # 直接调用新增的restore方法 pyglet.app.run()
这种方式完全不需要修改pyglet的源码,仅在自己的项目代码中实现即可,适配主流桌面平台,比早年修改源码的方案更灵活通用。
内容的提问来源于stack exchange,提问作者Raphael
相关产品推荐
相关产品推荐

