You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:05:14