Qt实现遮罩窗口系统全屏锁定或应用程序界面锁定

这篇具有很好参考价值的文章主要介绍了Qt实现遮罩窗口系统全屏锁定或应用程序界面锁定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.QMaskDialog

qmaskdialog.h

#ifndef QMASKDIALOG_H
#define QMASKDIALOG_H

#include <QDialog>
#include <QPainter>
#include <QDebug>
#include <QMovie>
#include <QKeyEvent>
#include <QStyleOption>
#include <QLineEdit>
#include "qhook.h"
namespace Ui {
class QMaskDialog;
}

class QMaskDialog : public QDialog
{
    Q_OBJECT

public:
    explicit QMaskDialog(const QString& tips, QWidget *parent = nullptr);
    ~QMaskDialog();

private:
    Ui::QMaskDialog *ui;
    QHook m_hook;
    QString m_tips;
protected:
    void paintEvent(QPaintEvent* event);
    bool eventFilter(QObject *, QEvent *);
};

#endif // QMASKDIALOG_H


qmaskdialog.cpp

#include "qmaskdialog.h"
#include "ui_qmaskdialog.h"

QMaskDialog::QMaskDialog(const QString &tips, QWidget *parent) :
    QDialog(parent),m_tips(tips),
    ui(new Ui::QMaskDialog)
{
    ui->setupUi(this);


//        setWindowFlags(Qt::Tool);		//当前窗口的构造函数下调用
//        setWindowFlags(Qt::ToolTip); 	//同时隐藏任务栏图标和标题栏图标

        //子窗口在父窗口之上,但仍可以对父窗口进行操作
//        this->setWindowFlags(Qt::WindowStaysOnTopHint);		//当前窗口置于顶部
        //如果要求只能操作子窗口,不能操作父窗口可以增加以下代码
//        this->setWindowModality(Qt::ApplicationModal); 		//阻塞除当前窗体之外的所有的窗体


//        //单击任务栏图标,对窗口进行显示/隐藏
//        this->setWindowFlags(Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint);
#if 1
    //系统所有窗口的顶层包括桌面
//    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint|Qt::X11BypassWindowManagerHint);
    setAttribute(Qt::WA_TranslucentBackground, true);
//    showMaximized();
    showFullScreen();
#else
    //当前应用程序的顶层窗口,exec调用,模态,无法关闭    show调用非模态,主窗口可接受close事件
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground, true);
    showMaximized();
#endif
//    qDebug()<< QMovie::supportedFormats();
//    QMovie *movie=new QMovie("E:\\qt64test\\untitled2\\gif\\progress\\22222.gif");
//    movie->setScaledSize(QSize(50,50));
//    movie->start();
//    ui->label->setMovie(movie);
//    ui->label->move(1000,500);
    installEventFilter(this);
//    setAttribute(Qt::WA_DeleteOnClose);
    m_hook.hook(true);
    m_hook.enableTaskManager(true);
}

QMaskDialog::~QMaskDialog()
{
    delete ui;
    m_hook.hook(false);
    m_hook.enableTaskManager(false);
}
void QMaskDialog::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QPainter painter(this);
    painter.fillRect(rect(),QColor(0,0,255,20));
    QFont font = this->font();
    font.setBold(true);
    font.setPixelSize(80);
    painter.setFont(font);
    painter.drawText(rect(), Qt::AlignCenter, m_tips);
}

bool QMaskDialog::eventFilter(QObject *obj, QEvent *e)
{
    switch (e->type()) {
    case QEvent::KeyPress:{
        QKeyEvent* ev = static_cast<QKeyEvent*>(e);
        if(ev->modifiers() == Qt::ControlModifier){
            if(ev->key() == Qt::Key_U){
                close();
                return true;
            }
        }
    }
        break;
    default:
        break;
    }
    return QDialog::eventFilter(obj,e);
}


showFullScreen:全屏遮罩
showMaximized:除任务栏外,全屏

qhook.h

#ifndef QHOOK_H
#define QHOOK_H

#include <QObject>
#include <Windows.h>
#include <QDebug>
#include <QSettings>
//在注册表该目录下增加新内容
#define TASKMANAGERSystem "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
#define TASKMANAGERExplorer "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"


class QHook : public QObject
{
    Q_OBJECT
public:
    explicit QHook(QObject *parent = nullptr);
    ~QHook();
    void hook(bool flag); //功能键
    void showTaskWindow(bool flag); //显示任务栏
    void enableTaskManager(bool flag); //任务管理器
private:
    HWND task;
signals:

};

#endif // QHOOK_H

qhook.cpp

#include "qhook.h"
#pragma comment(lib, "User32.lib")

HHOOK keyHook = NULL;
HHOOK mouseHook = NULL;

QHook::QHook(QObject *parent)
    : QObject{parent}
{

}

//键盘钩子过程
LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam )
{
    //在WH_KEYBOARD_LL模式下lParam 是指向KBDLLHOOKSTRUCT类型地址
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
    //如果nCode等于HC_ACTION则处理该消息,如果小于0,则钩子子程就必须将该消息传递给 CallNextHookEx
    if(nCode == HC_ACTION)
    {
        if((pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL)& 0x8000 && GetAsyncKeyState(VK_SHIFT)&0x8000)|| //"Ctrl+Shift+Esc"
            (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000) || //"Ctrl+Esc"
            (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN )|| //"Alt+Tab"
            (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN )|| //"Alt+Esc"
            (pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN )||	// "LWIN/RWIN"
            (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN )|| //"Alt+F4"
            (pkbhs->vkCode == VK_ESCAPE))
        {
            qDebug()<<"屏蔽";
            return 1;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
        }

        // 		if(pkbhs->vkCode == VK_F12)
        // 		{
        // 			void unHook();
        // 			qApp->quit();
        // 		}
    }
    return CallNextHookEx(keyHook, nCode, wParam, lParam);
}
//鼠标钩子过程
LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam )
{

    return 1;

}

QHook::~QHook()
{

}

//安装钩子,调用该函数即安装钩子
void QHook::hook(bool flag)
{
    if (flag)
    {
        //这两个底层钩子,不要DLL就可以全局
        //底层键盘钩子
        keyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,GetModuleHandle(NULL),0);
        //底层鼠标钩子
        //    mouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);
    }
    else
    {
        UnhookWindowsHookEx(keyHook);
        //  UnhookWindowsHookEx(mouseHook);
    }
}

//添加注册屏蔽Ctrl+Alt+del
void QHook::enableTaskManager(bool flag)
{
    // 屏蔽ctrl + alt +del 需要修改注册表的值, 取得管理员权限, 关闭360等杀毒软件
    int value = flag ? 0x00000001 : 0x00000000;
    QSettings *settings = new QSettings(TASKMANAGERSystem, QSettings::NativeFormat);
    settings->setValue("DisableTaskMgr", value); //任务管理器
    settings->setValue("DisableChangePassword", value); //更改密码
    settings->setValue("DisableLockWorkstation", value); //锁定计算机
    settings->setValue("DisableSwitchUserOption", value); //切换用户

    QSettings *settings2 = new QSettings(TASKMANAGERExplorer, QSettings::NativeFormat);
    settings2->setValue("NoLogOff", value); //注销

    delete settings;
    delete settings2;

}

//屏蔽任务栏
void QHook::showTaskWindow(bool flag)
{
    if(flag)
        ShowWindow(task,SW_SHOW);
    else
    {
        task=FindWindow(L"Shell_TrayWnd",NULL);
        ShowWindow(task,SW_HIDE);
    }
}

2.使用


    QMaskDialog *_maskdlg=new QMaskDialog(QString("锁定中,请勿关机"));
//    setFocusProxy(_maskdlg);
    _maskdlg->setWindowFlag(Qt::Tool);
    _maskdlg->raise();
//    _maskdlg->setGeometry(frameGeometry());
    _maskdlg->exec();
    _maskdlg->deleteLater();
    _maskdlg=nullptr;
    

若仅为应用程序主界面,则设置父窗口,并调用以下函数,盖住主界面

m_maskdlg->setGeometry(frameGeometry());

若要遮罩窗口跟随主界面自动拉伸,需重写主界面(MainWindow)的ResizeEvent,如果为全屏遮罩,则不需要,

void MainWindow::resizeEvent(QResizeEvent *event)
{
    if(m_maskdlg) m_maskdlg->setGeometry(frameGeometry());
}

3.效果图

qt 全屏独占,Qt记录,qt,ui,开发语言,c++

4、说明

目前的效果是仅屏蔽了鼠标按键,全屏范围不接受鼠标点击,如需屏蔽键盘按键,需要安装系统钩子,屏蔽特定的组合键(ALT+TAB,ESC,CTRL+ALT+DEL等等),并且修改注册表来实现,具体可以查看下面这位老哥的博文。

另外有个小bug,这个透明的全屏遮罩窗口,必须点击一下,才能响应ctrl+U关闭,即便调用setFocus()也无济于事,如有解决方法,欢迎评论留言

参考博文:https://blog.csdn.net/liulihuo_gyh/article/details/78129248文章来源地址https://www.toymoban.com/news/detail-817765.html

到了这里,关于Qt实现遮罩窗口系统全屏锁定或应用程序界面锁定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT 应用程序在 Windows 系统上出现中文乱码

    Windows 早期采用多字节编码,的确容易出现乱码问题。随着 Windows 全面转向 Unicode 编码,多语言的支持得到完美解决,出现中文乱码的问题就很少出现。出现乱码问题一般是 GBK 编码的文件当做 utf8 编码打开,或者 utf8编码的文件当做 GBK 编码打开。这种情况也多出现在 Linux 和

    2024年01月16日
    浏览(45)
  • 飞腾架构麒麟V10桌面系统Qt应用程序打包

    前言 本文记录了在飞腾架构麒麟V10桌面系统中打包Qt应用程序及部署的一些注意事项。打包工具使用的是linuxdeployqt,在飞腾架构架构下没有现成的工具安装包,需要自行编译安装。 1. linuxdeployqt 首先下载linuxqtdeploy下载地址https://github.com/probonopd/linuxdeployqt 下载之后解压目录如

    2024年02月11日
    浏览(89)
  • Qt实现一个简单的应用程序——桌面助手

    1、实现不同功能之间的界面切换 2、可查看日历 3、可实现计时器功能 4、可实现计算器功能 5、ui界面及按钮部件背景的设置 6、为软件设置图标 7、程序打包成软件       1、创建工程         New Project - Application - Qt Widgets Application然后下一步,使用ui界面文件能省去很多步骤

    2024年02月08日
    浏览(65)
  • Qt布局实战:实现高效、美观的GUI应用程序

    Qt是一个跨平台的GUI应用程序开发框架,提供了丰富的UI控件和布局管理器来实现应用程序的用户界面设计。Qt的布局管理器(layout manager)是一种将控件组织在容器中的机制,可以自动调整控件的位置和大小,以适应不同的窗口大小和屏幕分辨率。在Qt中,常用的布局管理器包

    2023年04月18日
    浏览(39)
  • Qt中的配置文件:实现个性化应用程序配置与保存加载

    在现代软件开发中,用户对于应用程序的个性化配置和设置变得越来越重要。为了满足用户需求并提供更好的用户体验,开发人员常常需要实现一种机制,以便在每次启动应用程序时能够记住用户上次的配置。这样用户就可以方便地恢复到他们熟悉的环境,无需重新进行所有

    2024年02月11日
    浏览(51)
  • C#控制台应用程序如何添加窗口关闭事件?

    公司有一个控制台应用程序,在关闭控制台应用程序窗口前,想处理一下业务逻辑。还有比如误操作关闭了,或者像消息队列启动了发送消息提醒,那关闭了窗口代表控制台应用销毁了,也需要发送消息通知。那这个时候添加关闭窗口事件就派上用场了。 很多小伙伴问,有没

    2024年02月13日
    浏览(47)
  • <QT开发> QT开发工具-之-QT应用程序打包

    <QT开发> QT开发工具-之-QT应用程序打包 笔者为什么会写这篇文章呢?这是因为,笔者使用windows QT开发了一个测试工具。目的是通过TCP/IP测试其它应用程序。首先这个QT程序是笔者自己开发的,所以笔者的电脑当然是可以运行这个QT程序的,但是想要这个QT程序在其它同事的

    2024年02月12日
    浏览(125)
  • 《Qt开发》MDI应用程序

    实现多个子窗体的自定义布局(自定义子窗体尺寸和位置)、平铺布局(titleSubWindows)和分页模式(QMdi::TabbedView)。 运行效果图 初始布局(自定义布局) 平铺布局 多页模式 实现过程 1. 创建项目MdiFirstDemo,并创建3个子窗体,分别为FirstSubWindow、SecondSubWindow和ThirdSubWindow。

    2024年01月16日
    浏览(48)
  • 【QT】多窗体应用程序设计

    目录 1主要的窗体类及其用途 2 窗体类重要特性的设置 2.1 setAttribute()函数 2.2 setWindowFlags()函数 2.3 setWindowState()函数 2.4 setWindowModality()函数 2.5 setWindowOpacity()函数 3 多窗口应用程序的设计 3.1 主窗口设计 3.2 QFormDoc类的设计 3.3 QFormDoc类的使用 3.4 QFormTable类的设计 3.5 QFormTable类的使

    2024年01月18日
    浏览(44)
  • 【QT】MDI应用程序设计

    目录 1 MDI简介 2 文档窗口类QFormDoc的设计 3 MDI主窗口设计与子窗口的使用 3.1 主窗口界面设计 3.2 MDI子窗口的创建与加入 3.3 QMdiArea常用功能函数 3.4 MDI的信号         传统的应用程序设计中有多文档界面(Multi-documentInterface,MDI)应用程序,Qt为设计 MDI应用程序提供了支持。

    2024年01月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包