为你的Qt程序添加开机自启功能
原文链接:https://blog.csdn.net/hwc3737/article/details/108306600
实现原理:
软件设置开机自启,即通过在计算机注册表的HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run目录中,以键值对的方式写入程序名称和程序目录来实现。相反,关闭开机自启,则是通过删除注册表内该程序信息进行设置。
实现步骤:
下面以实际案例进行演示。
①最终效果
通过点击此checkBox(以上为修改样式表后效果),实现一键控制程序是否开机自启。
②添加头文件
#include <QSettings>
#include <QDir>
③注册表操作函数
说明:
可将此函数直接作为主窗口类的私有函数。
所需修改的地方:
函数内第一行的“YourAppName”需要修改为你的程序名称,作为写入注册表的程序标识。
void MainWindow::appAutoRun(bool bAutoRun)
{
QString application_name = "YourAppName";
QSettings *settings = new QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
if(bAutoRun){
QString application_path = QApplication::applicationFilePath();
settings->setValue(application_name, application_path.replace("/", "\\"));
}else{
settings->remove(application_name);
}
delete settings;
}
调用方式:
appAutoRun(true); //写入注册表,实现开机自启
appAutoRun(false); //从注册表中移除,关闭开机自启
④判断是否已写入
说明:
此处仍直接作为主窗口类的私有函数。
所需修改的地方:
同上,“YourAppName”需要修改为你的程序标识名称。
bool MainWindow::isAppAutoRun()
{
//查看注册表是否已经写入程序名称
QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
QString strValue = reg->value("YourAppName").toString(); //获取注册表中“YourAppName”对应的路径值
QString path = QDir::toNativeSeparators(QCoreApplication::applicationFilePath()); //获取当前程序完整路径
bool flag = (strValue == path); //flag为true则表示注册表中已有此项
return flag;
}
⑤综合使用
为checkBox添加click(bool)信号:
代码内容:
void MainWindow::on_check_openself_clicked(bool checked)
{
bool flag = isAppAutoRun(); //获取开机自启状态
if(checked&&!flag){ //满足checkBox被选中同时未设置开机自启,则开启
appAutoRun(true);
}else if(!checked&&flag){ //满足checkBox未被选中同时已设置开机自启,则关闭
appAutoRun(false);
}
}
⑥功能完善
问题描述:
由于程序每次启动后,界面会恢复初始状态。导致设置开机自启并重启程序后,checkBox的初始状态没有跟实际情况相匹配,原本已设置开机自启,但checkBox并未展示,影响客户体验。
解决方法:
在界面窗口的构造函数中,添加检索注册表是否已有该程序,并根据结果对checkBox的初始状态进行设置。
实现如下:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
bool flag = isAppAutoRun();
ui->check_openself->setChecked(flag); //根据得到的flag对checkBox进行界面初始化
}
若有发现问题,欢迎留言补充。
转载请注明出处。