Qt:Windows编程—Qt实现注册表启动项管理

Qt:Windows编程—Qt实现注册表启动项管理Qt实现注册表启动项管理前言Windows的开机启动项在很多地方都有设置,这次我们在注册表子键"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run"这个位置也有Windows的开机启动。这次我们用qt实现开启启动项管理,有启动项添加、删除功能。这里简单说说注册表相关的概念。注册表是Windows系…

Qt实现注册表启动项管理

前言

Windows的开机启动项在很多地方都有设置,这次我们在注册表 子键”HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run” 这个位置也有 Windows的开机启动。这次我们用qt实现 开启启动项管理,有 启动项 添加、删除 功能。这里 简单说说 注册表相关的概念

注册表是Windows系统管理和维护的配置较为复杂的信息数据库,它以树状形式存储信息。
注册表由 根键、子键 和 键值项。子键和键值对 中存在的具体数据有3部分,值名称、值类型、值
根键:
在这里插入图片描述
子键:类似文件夹,根键下包含多个子键,子键下也可以包含多个子键。
键值项:不含子键的子键就是键值项。

Windows API

使用的Windows API 如下:
注册表相关api,MSDN链接:https://docs.microsoft.com/zh-cn/windows/desktop/api/winreg/

  1. 打开和关闭注册表,所谓打开注册表,实质是打开注册表的某一个子键,然后进行操作

LSTATUS RegOpenKeyExA(
HKEY hKey, // handle to open key,指向父键句柄
LPCSTR lpSubKey, // subkey name
DWORD ulOptions, // reserved,必须指定为0
REGSAM samDesired, // security access mask,方便操作 通常使用 KEY_ALL_ACCESS
PHKEY phkResult// 指向双子变量,用来接收打开的子键句柄
);
函数指向成功,返回ERROR_SUCCESS,phkResult保存打开子键的句柄
// 关闭注册表句柄
LSTATUS RegCloseKey(
HKEY hKey
);

  1. 添加/修改键值项

LSTATUS RegSetValueExA(
HKEY hKey, // 用来指定写入的键值项所处的子键句柄
LPCSTR lpValueName, // 键值项 名称
DWORD Reserved, // 保留参数,必须为0
DWORD dwType, // 写入的键值数据的类型
const BYTE *lpData, // 写入键值数据的 缓冲区
DWORD cbData // 缓冲区长度
);

  1. 删除键值项

LSTATUS RegDeleteValueA(
HKEY hKey, // 删除的句柄
LPCSTR lpValueName // 被删除键值项的名称
);

效果

在这里插入图片描述
点确定 添加启动项
在这里插入图片描述

核心代码

其实 很简单,就是上面那几个 API函数的应用 再加上 qt写界面就简单实现。
表格刷新

void Widget::refreshTable(){
    // 清空表格
    int row = ui->tableWidget->rowCount();
    for( int i = 0; i < row; i++){
        ui->tableWidget->removeRow(0);
    }

    unsigned long i = 0;
    char name[1024] = {0};
    BYTE data[1024] = {0};
    unsigned long nameLen = 1024;
    unsigned long dataLen = 1024;//DWORD = unsigned long
//    ui->tableWidget->
    LSTATUS lRet;
    while(true){
        lRet = RegEnumValueA(mRunKey,i,name,&nameLen,nullptr,nullptr,data,&dataLen);
        if(lRet ==  ERROR_NO_MORE_ITEMS)
            break;
        qDebug() << "i = " << i;

        ui->tableWidget->insertRow(0);
        ui->tableWidget->setItem(0,0,new QTableWidgetItem(name));
        ui->tableWidget->setItem(0,1,new QTableWidgetItem((char*)data));
        i++;
    }
}

添加启动项

void AddStart::on_sureButton_clicked()
{
    QString key = ui->startKey->text();
    QString value = ui->startValue->text();
    if(key.isEmpty() || (value.isEmpty())){
        qDebug() << "请正确填写!";
        return;
    }

    LSTATUS lRet;
    lRet = RegSetValueExA(mRunKey,key.toStdString().c_str(),0,REG_SZ,
                   (BYTE*)value.toStdString().c_str(),value.length()+1);
    if( lRet != ERROR_SUCCESS){
        qDebug() << "添加启动项失败";
        return;
    }

    emit addDone();
    this->close();
}

完整代码

如果有兴趣,可以下载完整工程 或者github下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37395.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注