如何在PyQt5全屏无框应用中屏蔽Win/Meta键弹出任务栏
解决方案:强制窗口重新激活以覆盖弹出的任务栏
由于Windows系统会优先捕获Win/Meta键事件,导致任务栏弹出,我们可以通过在窗口失去焦点或检测到Win键按下时,强制将应用重新置顶并激活的方式,让应用立刻覆盖任务栏。以下是具体实现步骤:
1. 依赖准备
首先安装pywin32库,用于调用Windows系统API强制置顶窗口:
pip install pywin32
2. 修改应用代码
在你的UserInterface类中添加以下逻辑:
import win32gui from PyQt5.QtCore import QTimer, QtCore from PyQt5.QtWidgets import QWidget, QShortcut from PyQt5.QtGui import QKeySequence class UserInterface(QWidget, Ui_Form): def __init__(self): super(UserInterface, self).__init__() self.setupUi(self) self.setWindowTitle("HIM") # 配置全屏无框且始终置顶的窗口属性 self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowStaysOnTopHint) self.setWindowFlag(QtCore.Qt.FramelessWindowHint, True) self.showFullScreen() # 解锁相关配置 self.password_textbox.setEchoMode(2) self.password_textbox.returnPressed.connect(self.unlock) self.password_textbox.hide() # 显示密码框的快捷键 shortcut = QShortcut(QKeySequence("P,Y"), self) shortcut.activated.connect(self.show_buttons) def keyPressEvent(self, e): if e.key() == QtCore.Qt.Key_Meta: # 延迟100ms执行恢复操作,确保Windows处理完Win键事件 QTimer.singleShot(100, self.restore_fullscreen) e.accept() else: super().keyPressEvent(e) def focusOutEvent(self, event): # 当窗口失去焦点时(比如Win键弹出任务栏),立刻重新激活窗口 self.restore_fullscreen() super().focusOutEvent(event) def restore_fullscreen(self): # 使用Windows API强制将窗口置于前台 win32gui.SetForegroundWindow(self.winId()) # Qt自身的激活和全屏方法双保险 self.activateWindow() self.showFullScreen() def show_buttons(self): if self.password_textbox.isHidden(): self.password_textbox.show() self.password_textbox.setFocus() else: self.password_textbox.hide() def unlock(self): pwd = self.password_textbox.text() if pwd == "my_password": self.showMinimized() self.password_textbox.setText('') self.password_textbox.hide()
3. 原理说明
- Win键事件处理:捕获到Win键按下后,通过
QTimer延迟执行恢复操作,避免和Windows系统的事件处理冲突。 - 焦点丢失处理:重写
focusOutEvent,一旦窗口失去焦点(比如任务栏弹出抢占焦点),立刻触发窗口恢复逻辑。 - 双保险置顶:同时使用Windows API的
SetForegroundWindow和Qt的activateWindow()、showFullScreen(),确保窗口能快速回到顶层覆盖任务栏。
这种方式不会全局禁用Win键,只有当你的应用处于全屏状态时才会生效,完全符合需求。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

