Qt_屏幕保护程序、进程监听、数据库读取、屏幕保护

Qt_屏幕保护程序、进程监听、数据库读取、屏幕保护

​ 这个小项目呢是接收被人写的一个代码,自己稍微加工改动了一下,改成自己的喜欢的风格吧,我不喜欢里面加一堆对当前没有用的东西,所以基本就不相关的都删除了。今天是1024必须的水一篇。


文章目录

关键字: QtHHOOK屏幕保护程序数据库关键进程监听

钩子部分

​ 先上关键代码,使用钩子伙子键盘和鼠标,并屏蔽win键 alt键和F4键

bool isLoginShow = false;
int  count = 0;
HHOOK keyHook = NULL;
HHOOK mouseHook = NULL;

/**
 * @brief keyProc
 * @param nCode
 * @param wParam
 * @param lParam
 * @return
 * 键盘钩子过程,屏蔽了win键 alt键和F4键
 */
LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam )
{
    Q_UNUSED(wParam)
    Q_UNUSED(nCode)

    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
    if(isLoginShow)
        if((pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN )|| (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN ))
            return 1;
    count = 0;
    return 0;       //返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
}
/**
 * @brief mouseProc
 * @param nCode
 * @param wParam
 * @param lParam
 * @return
 * 鼠标钩子过程
 */
LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam )
{
    Q_UNUSED(nCode)
    Q_UNUSED(wParam)
    Q_UNUSED(lParam)
    count = 0;
    return 0;
}
/**
 * @brief unHook
 * 卸载钩子
 */
void unHook()
{
    UnhookWindowsHookEx(keyHook);
    UnhookWindowsHookEx(mouseHook);
}

/**
 * @brief setHook
 * 安装钩子,调用该函数即安装钩子
 */
void setHook()
{
    //这两个底层钩子,不要DLL就可以全局
    keyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,GetModuleHandle(NULL),0);     //底层键盘钩子
    mouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);    //底层鼠标钩子
}
/**
 * @brief SetProcessAutoRunSelf
 * @param isstart
 * 自动启动程序,把程序写到开机启动注册表里面
 */
void SetProcessAutoRunSelf(bool isstart)
{
    QString application_name = QApplication::applicationName();                         //获取应用名称
    QSettings *settings = new QSettings(AUTO_RUN, QSettings::NativeFormat);             //创建QSetting, 需要添加QSetting头文件
    if (isstart)
    {
        QString application_path = QApplication::applicationFilePath();                 //找到应用的目录
        settings->setValue(application_name, application_path.replace("/", "\\"));      //写入注册表
    }
    else
    {
        settings->remove(application_name);
    }
}

进行监听部分

​ 关键代码,该函数查询某个进程是否启动并返回结果。

bool TrayListener::isProcessRunning(QString processName)
{
	bool ret = false;
	HANDLE proHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if ((HANDLE)-1 == proHandle)
	{
		return false;
	}
    PROCESSENTRY32 pInfo;                                       //进程信息
    pInfo.dwSize = sizeof(PROCESSENTRY32);
    BOOL bResult = Process32First(proHandle, &pInfo);           //获得第一个进程
    if (!bResult)
    {
        return false;
    }
    QString curProcessName;
    while (bResult)
    {
        curProcessName = QString("%1").arg(QString::fromUtf16(reinterpret_cast<const unsigned short *>(pInfo.szExeFile)));
        if (curProcessName == processName)
        {
            ret = true;
            break;
        }
        bResult = Process32Next(proHandle, &pInfo);             //获得下一个进程
	}
    CloseHandle(proHandle);     //关闭句柄
	return ret;
}

数据库查询部分

登录部分就是需要把用户名转换成数据库关键字,关键代码

/**
 * @brief Login::loginSystem
 * 数据库校验
 */
void Login::loginSystem()
{
    QString application_path = Config().Get("DataBase_Info","DataBase_File_Path").toString();
    QSqlDatabase db;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
        db = QSqlDatabase::database("qt_sql_default_connection");
    else
        db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(application_path);
    if(!db.open()){
        QMessageBox::information(this, QStringLiteral("连接结果"), QStringLiteral("连接数据库失败!"));
        return;
    }
    /*************************************************名字转换*****************************************************/
    QString username = ui->comboBox->currentText();
    if(username ==  QString::fromLocal8Bit("技师"))               //前任留下的坑,这里需要注意,VS不做转换会有编码问题
        username = "Technician";
    else if(username == QString::fromLocal8Bit("医师"))           //前任留下的坑,这里需要注意,VS不做转换会有编码问题
        username = "Doctor";
    else if(username == QString::fromLocal8Bit("匿名"))           //前任留下的坑,这里需要注意,VS不做转换会有编码问题
        username = "Emergent";
    else
        username = "Administrator";
    /*************************************************名字转换*****************************************************/
    QString password = ui->lineEdit_password->text();
    if(password == "" && username != "Emergent")
    {
        QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("密码不能为空!"), QStringLiteral("确定"));
        return;
    }
    if(username != "Emergent")
    {
        QString strSql = QString("select * from user_info where name ='%1'and password = '%2' ").arg(username).arg(password);
        QSqlQuery query;
        query.exec(strSql);
        QSqlQueryModel queryModel;
        queryModel.setQuery(query);
        int nRecordCount = queryModel.rowCount();
        if (nRecordCount <= 0)
        {
            QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("用户名或者密码错误!"), QStringLiteral("确定"));
            ui->lineEdit_password->clear();
        }
        else
        {
            ui->lineEdit_password->clear();
            accept();
        }
    }
    else
    {
        accept();
    }
}

屏保

屏保就是加载了一个Gif动画,本来想绘制曲线了,能力不够,渣渣

    ui->labelScreen->setScaledContents(true);
    QMovie *iconShow = new QMovie(":/images/screen.gif");
    ui->labelScreen->setMovie(iconShow);
    iconShow->start();

详细项目信息暂不公开。


Qt_屏幕保护程序、进程监听、数据库读取、屏幕保护
上一篇:Qt中类型之间的转换


下一篇:ffmpeg解码h265,并用Qt显示