这个小项目呢是接收被人写的一个代码,自己稍微加工改动了一下,改成自己的喜欢的风格吧,我不喜欢里面加一堆对当前没有用的东西,所以基本就不相关的都删除了。今天是1024
必须的水一篇。
文章目录
关键字:
Qt
、HHOOK
、屏幕保护程序
、数据库
、关键进程监听
钩子部分
先上关键代码,使用钩子伙子键盘和鼠标,并屏蔽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();
详细项目信息暂不公开。