国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt實(shí)現(xiàn)遮罩窗口系統(tǒng)全屏鎖定或應(yīng)用程序界面鎖定

這篇具有很好參考價(jià)值的文章主要介紹了Qt實(shí)現(xiàn)遮罩窗口系統(tǒng)全屏鎖定或應(yīng)用程序界面鎖定。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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);		//當(dāng)前窗口的構(gòu)造函數(shù)下調(diào)用
//        setWindowFlags(Qt::ToolTip); 	//同時(shí)隱藏任務(wù)欄圖標(biāo)和標(biāo)題欄圖標(biāo)

        //子窗口在父窗口之上,但仍可以對(duì)父窗口進(jìn)行操作
//        this->setWindowFlags(Qt::WindowStaysOnTopHint);		//當(dāng)前窗口置于頂部
        //如果要求只能操作子窗口,不能操作父窗口可以增加以下代碼
//        this->setWindowModality(Qt::ApplicationModal); 		//阻塞除當(dāng)前窗體之外的所有的窗體


//        //單擊任務(wù)欄圖標(biāo),對(duì)窗口進(jìn)行顯示/隱藏
//        this->setWindowFlags(Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint);
#if 1
    //系統(tǒng)所有窗口的頂層包括桌面
//    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint|Qt::X11BypassWindowManagerHint);
    setAttribute(Qt::WA_TranslucentBackground, true);
//    showMaximized();
    showFullScreen();
#else
    //當(dāng)前應(yīng)用程序的頂層窗口,exec調(diào)用,模態(tài),無法關(guān)閉    show調(diào)用非模態(tài),主窗口可接受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:除任務(wù)欄外,全屏

qhook.h

#ifndef QHOOK_H
#define QHOOK_H

#include <QObject>
#include <Windows.h>
#include <QDebug>
#include <QSettings>
//在注冊(cè)表該目錄下增加新內(nèi)容
#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); //顯示任務(wù)欄
    void enableTaskManager(bool flag); //任務(wù)管理器
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表示不作處理,消息繼續(xù)傳遞
        }

        // 		if(pkbhs->vkCode == VK_F12)
        // 		{
        // 			void unHook();
        // 			qApp->quit();
        // 		}
    }
    return CallNextHookEx(keyHook, nCode, wParam, lParam);
}
//鼠標(biāo)鉤子過程
LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam )
{

    return 1;

}

QHook::~QHook()
{

}

//安裝鉤子,調(diào)用該函數(shù)即安裝鉤子
void QHook::hook(bool flag)
{
    if (flag)
    {
        //這兩個(gè)底層鉤子,不要DLL就可以全局
        //底層鍵盤鉤子
        keyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,GetModuleHandle(NULL),0);
        //底層鼠標(biāo)鉤子
        //    mouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);
    }
    else
    {
        UnhookWindowsHookEx(keyHook);
        //  UnhookWindowsHookEx(mouseHook);
    }
}

//添加注冊(cè)屏蔽Ctrl+Alt+del
void QHook::enableTaskManager(bool flag)
{
    // 屏蔽ctrl + alt +del 需要修改注冊(cè)表的值, 取得管理員權(quán)限, 關(guān)閉360等殺毒軟件
    int value = flag ? 0x00000001 : 0x00000000;
    QSettings *settings = new QSettings(TASKMANAGERSystem, QSettings::NativeFormat);
    settings->setValue("DisableTaskMgr", value); //任務(wù)管理器
    settings->setValue("DisableChangePassword", value); //更改密碼
    settings->setValue("DisableLockWorkstation", value); //鎖定計(jì)算機(jī)
    settings->setValue("DisableSwitchUserOption", value); //切換用戶

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

    delete settings;
    delete settings2;

}

//屏蔽任務(wù)欄
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("鎖定中,請(qǐng)勿關(guān)機(jī)"));
//    setFocusProxy(_maskdlg);
    _maskdlg->setWindowFlag(Qt::Tool);
    _maskdlg->raise();
//    _maskdlg->setGeometry(frameGeometry());
    _maskdlg->exec();
    _maskdlg->deleteLater();
    _maskdlg=nullptr;
    

若僅為應(yīng)用程序主界面,則設(shè)置父窗口,并調(diào)用以下函數(shù),蓋住主界面

m_maskdlg->setGeometry(frameGeometry());

若要遮罩窗口跟隨主界面自動(dòng)拉伸,需重寫主界面(MainWindow)的ResizeEvent,如果為全屏遮罩,則不需要,

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

3.效果圖

qt 全屏獨(dú)占,Qt記錄,qt,ui,開發(fā)語言,c++

4、說明

目前的效果是僅屏蔽了鼠標(biāo)按鍵,全屏范圍不接受鼠標(biāo)點(diǎn)擊,如需屏蔽鍵盤按鍵,需要安裝系統(tǒng)鉤子,屏蔽特定的組合鍵(ALT+TAB,ESC,CTRL+ALT+DEL等等),并且修改注冊(cè)表來實(shí)現(xiàn),具體可以查看下面這位老哥的博文。

另外有個(gè)小bug,這個(gè)透明的全屏遮罩窗口,必須點(diǎn)擊一下,才能響應(yīng)ctrl+U關(guān)閉,即便調(diào)用setFocus()也無濟(jì)于事,如有解決方法,歡迎評(píng)論留言

參考博文:https://blog.csdn.net/liulihuo_gyh/article/details/78129248文章來源地址http://www.zghlxwxcb.cn/news/detail-817765.html

到了這里,關(guān)于Qt實(shí)現(xiàn)遮罩窗口系統(tǒng)全屏鎖定或應(yīng)用程序界面鎖定的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • QT 應(yīng)用程序在 Windows 系統(tǒng)上出現(xiàn)中文亂碼

    Windows 早期采用多字節(jié)編碼,的確容易出現(xiàn)亂碼問題。隨著 Windows 全面轉(zhuǎn)向 Unicode 編碼,多語言的支持得到完美解決,出現(xiàn)中文亂碼的問題就很少出現(xiàn)。出現(xiàn)亂碼問題一般是 GBK 編碼的文件當(dāng)做 utf8 編碼打開,或者 utf8編碼的文件當(dāng)做 GBK 編碼打開。這種情況也多出現(xiàn)在 Linux 和

    2024年01月16日
    瀏覽(31)
  • 飛騰架構(gòu)麒麟V10桌面系統(tǒng)Qt應(yīng)用程序打包

    飛騰架構(gòu)麒麟V10桌面系統(tǒng)Qt應(yīng)用程序打包

    前言 本文記錄了在飛騰架構(gòu)麒麟V10桌面系統(tǒng)中打包Qt應(yīng)用程序及部署的一些注意事項(xiàng)。打包工具使用的是linuxdeployqt,在飛騰架構(gòu)架構(gòu)下沒有現(xiàn)成的工具安裝包,需要自行編譯安裝。 1. linuxdeployqt 首先下載linuxqtdeploy下載地址https://github.com/probonopd/linuxdeployqt 下載之后解壓目錄如

    2024年02月11日
    瀏覽(92)
  • Qt實(shí)現(xiàn)一個(gè)簡單的應(yīng)用程序——桌面助手

    Qt實(shí)現(xiàn)一個(gè)簡單的應(yīng)用程序——桌面助手

    1、實(shí)現(xiàn)不同功能之間的界面切換 2、可查看日歷 3、可實(shí)現(xiàn)計(jì)時(shí)器功能 4、可實(shí)現(xiàn)計(jì)算器功能 5、ui界面及按鈕部件背景的設(shè)置 6、為軟件設(shè)置圖標(biāo) 7、程序打包成軟件 ? ? ? 1、創(chuàng)建工程 ? ? ? ? New Project - Application - Qt Widgets Application然后下一步,使用ui界面文件能省去很多步驟

    2024年02月08日
    瀏覽(66)
  • Qt布局實(shí)戰(zhàn):實(shí)現(xiàn)高效、美觀的GUI應(yīng)用程序

    Qt是一個(gè)跨平臺(tái)的GUI應(yīng)用程序開發(fā)框架,提供了豐富的UI控件和布局管理器來實(shí)現(xiàn)應(yīng)用程序的用戶界面設(shè)計(jì)。Qt的布局管理器(layout manager)是一種將控件組織在容器中的機(jī)制,可以自動(dòng)調(diào)整控件的位置和大小,以適應(yīng)不同的窗口大小和屏幕分辨率。在Qt中,常用的布局管理器包

    2023年04月18日
    瀏覽(22)
  • Qt中的配置文件:實(shí)現(xiàn)個(gè)性化應(yīng)用程序配置與保存加載

    在現(xiàn)代軟件開發(fā)中,用戶對(duì)于應(yīng)用程序的個(gè)性化配置和設(shè)置變得越來越重要。為了滿足用戶需求并提供更好的用戶體驗(yàn),開發(fā)人員常常需要實(shí)現(xiàn)一種機(jī)制,以便在每次啟動(dòng)應(yīng)用程序時(shí)能夠記住用戶上次的配置。這樣用戶就可以方便地恢復(fù)到他們熟悉的環(huán)境,無需重新進(jìn)行所有

    2024年02月11日
    瀏覽(31)
  • C#控制臺(tái)應(yīng)用程序如何添加窗口關(guān)閉事件?

    C#控制臺(tái)應(yīng)用程序如何添加窗口關(guān)閉事件?

    公司有一個(gè)控制臺(tái)應(yīng)用程序,在關(guān)閉控制臺(tái)應(yīng)用程序窗口前,想處理一下業(yè)務(wù)邏輯。還有比如誤操作關(guān)閉了,或者像消息隊(duì)列啟動(dòng)了發(fā)送消息提醒,那關(guān)閉了窗口代表控制臺(tái)應(yīng)用銷毀了,也需要發(fā)送消息通知。那這個(gè)時(shí)候添加關(guān)閉窗口事件就派上用場了。 很多小伙伴問,有沒

    2024年02月13日
    瀏覽(27)
  • <QT開發(fā)> QT開發(fā)工具-之-QT應(yīng)用程序打包

    <QT開發(fā)> QT開發(fā)工具-之-QT應(yīng)用程序打包

    <QT開發(fā)> QT開發(fā)工具-之-QT應(yīng)用程序打包 筆者為什么會(huì)寫這篇文章呢?這是因?yàn)?,筆者使用windows QT開發(fā)了一個(gè)測(cè)試工具。目的是通過TCP/IP測(cè)試其它應(yīng)用程序。首先這個(gè)QT程序是筆者自己開發(fā)的,所以筆者的電腦當(dāng)然是可以運(yùn)行這個(gè)QT程序的,但是想要這個(gè)QT程序在其它同事的

    2024年02月12日
    瀏覽(841)
  • 《Qt開發(fā)》MDI應(yīng)用程序

    《Qt開發(fā)》MDI應(yīng)用程序

    實(shí)現(xiàn)多個(gè)子窗體的自定義布局(自定義子窗體尺寸和位置)、平鋪布局(titleSubWindows)和分頁模式(QMdi::TabbedView)。 運(yùn)行效果圖 初始布局(自定義布局) 平鋪布局 多頁模式 實(shí)現(xiàn)過程 1. 創(chuàng)建項(xiàng)目MdiFirstDemo,并創(chuàng)建3個(gè)子窗體,分別為FirstSubWindow、SecondSubWindow和ThirdSubWindow。

    2024年01月16日
    瀏覽(85)
  • 【QT】MDI應(yīng)用程序設(shè)計(jì)

    【QT】MDI應(yīng)用程序設(shè)計(jì)

    目錄 1 MDI簡介 2 文檔窗口類QFormDoc的設(shè)計(jì) 3 MDI主窗口設(shè)計(jì)與子窗口的使用 3.1 主窗口界面設(shè)計(jì) 3.2 MDI子窗口的創(chuàng)建與加入 3.3 QMdiArea常用功能函數(shù) 3.4 MDI的信號(hào) ?? ??? ?傳統(tǒng)的應(yīng)用程序設(shè)計(jì)中有多文檔界面(Multi-documentInterface,MDI)應(yīng)用程序,Qt為設(shè)計(jì) MDI應(yīng)用程序提供了支持。

    2024年01月25日
    瀏覽(33)
  • 【QT】多窗體應(yīng)用程序設(shè)計(jì)

    【QT】多窗體應(yīng)用程序設(shè)計(jì)

    目錄 1主要的窗體類及其用途 2 窗體類重要特性的設(shè)置 2.1 setAttribute()函數(shù) 2.2 setWindowFlags()函數(shù) 2.3 setWindowState()函數(shù) 2.4 setWindowModality()函數(shù) 2.5 setWindowOpacity()函數(shù) 3 多窗口應(yīng)用程序的設(shè)計(jì) 3.1 主窗口設(shè)計(jì) 3.2 QFormDoc類的設(shè)計(jì) 3.3 QFormDoc類的使用 3.4 QFormTable類的設(shè)計(jì) 3.5 QFormTable類的使

    2024年01月18日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包