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/
- 打开和关闭注册表,所谓打开注册表,实质是打开注册表的某一个子键,然后进行操作
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
);
- 添加/修改键值项
LSTATUS RegSetValueExA(
HKEY hKey, // 用来指定写入的键值项所处的子键句柄
LPCSTR lpValueName, // 键值项 名称
DWORD Reserved, // 保留参数,必须为0
DWORD dwType, // 写入的键值数据的类型
const BYTE *lpData, // 写入键值数据的 缓冲区
DWORD cbData // 缓冲区长度
);
- 删除键值项
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();
}
完整代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37395.html