Electron中如何检测窗口最大化事件
无轮询实现窗口最大化时自动切换最大化图标方案
所有触发窗口最大化的操作——不管是双击标题栏、拖拽窗口到屏幕顶部吸附、点击最大化按钮、用系统快捷键触发最大化——本质都是修改窗口的显示状态,这类状态变更都是事件驱动的,UI框架/系统会在状态切换完成的瞬间主动抛出对应事件,直接监听事件处理即可,完全不需要轮询调用isMaximized()。
轮询是最次的实现方案,不仅浪费性能,还存在状态更新延迟的问题,事件监听是这类场景的标准实现方式。
常见技术栈具体实现
- Electron
直接监听BrowserWindow实例自带的maximize、unmaximize事件,两个事件分别对应窗口进入最大化、退出最大化的时机,覆盖所有最大化触发路径:// 窗口初始化完成后绑定事件即可 mainWindow.on('maximize', () => { // 替换按钮图标为还原样式 maximizeButton.setIcon(iconRestore) }) mainWindow.on('unmaximize', () => { // 替换按钮图标为普通最大化样式 maximizeButton.setIcon(iconMaximize) }) - WPF
监听窗口的StateChanged事件,在回调中判断当前窗口状态后切换图标:public MainWindow() { InitializeComponent(); this.StateChanged += (_, _) => { MaximizeBtn.Icon = this.WindowState == WindowState.Maximized ? Properties.Resources.Restore : Properties.Resources.Maximize; }; } - Qt
重写窗口的changeEvent方法,捕获窗口状态变更事件处理即可:void MainWindow::changeEvent(QEvent *e) { if (e->type() == QEvent::WindowStateChange) { ui->maximizeBtn->setIcon(isMaximized() ? restoreIcon : maximizeIcon); } QMainWindow::changeEvent(e); } - 原生Win32
在窗口过程函数中处理WM_SIZE消息,当wParam为SIZE_MAXIMIZED时切换为还原图标,wParam为SIZE_RESTORED时切回最大化图标即可。
补充说明:以上事件都是状态实际生效后才会触发,不存在漏判、误判问题,事件触发的时机和窗口实际显示状态完全同步。
内容的提问来源于stack exchange,提问作者BBB
相关产品推荐
相关产品推荐

