注册表自启动调试记录

一、注册表路径

1、假设写入的路径为“HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run”

对于64位程序,实际写入的路径与上述相符

对于32位程序,实际写入的路径会重定向到“HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run”

2、假如写入的路径为“HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run” 

无论是64位还是32位的程序,实际写入的路径与上述相符

二、调试Tips

1、程序要成功在注册表写入自启动项,保险一点还是右键以管理员运行

2、右键以管理员权限运行时仍写入注册表失败,可以排查一下是不是360等杀毒软件拦截了,有时候拦截时甚至不会弹窗提醒你

3、自启动项中程序路径的分隔符要采用windows系统的"\\",不能采用"/",否则该路径是错误的,程序启动不了(在QT中,用QApplication::applicationFilePath返回的路径是"/"分割的,还需要用QDir::toNativeSeparators对路径的分隔符进行转换)

4、如果需要程序以管理员权限自启动,除了在编译生成程序时要带有UAC权限,还要降低系统的权限管理等级

5、无论是64位还是32位的程序,设置了以管理员权限启动,如果写入的自启动路径是“HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run”,系统重启后程序无法启动(即无反应,连权限的弹窗都没有),如果写入的自启动路径是“HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run”,可以顺利启动起来(可能有权限的弹窗,但程序是起来了的)

6、在shell:startup的自启动文件夹中,设置了以管理员权限启动的程序是无法启动的

三、自启动QT代码示例

1、注册表方式

#写入在WOW6432Node下无论程序需不需要管理员权限都可用

#采用写入快捷方式路径而不是程序路径,是因为自启动程序路径的话,如果程序里面有用到相对路径读写文件,那会出现找不到文件的情况,因为此时的工作路径在C盘的某个启动文件夹中,而自启动快捷方式则不会出现该问题

void setExeAutoRun(bool bAutoRun)
{
	QString strAppName = QApplication::applicationName();//程序名称
	QString strAppPath = QDir::toNativeSeparators(QApplication::applicationFilePath());//程序路径
	QSettings regAutoRun("HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
	if (bAutoRun)
	{		
		QString strLinkPath = strAppPath;
		strLinkPath.replace(".exe", ".lnk");
		//在程序目录下创建快捷方式
		if (QFile::exists(strLinkPath))
		{
			QString strSrcAppPath = QDir::toNativeSeparators(QFileInfo(strLinkPath).canonicalFilePath());//快捷方式指向的源程序路径
			if (strSrcAppPath != strAppPath)
			{
				QFile::link(strAppPath, strLinkPath);
			}
		}
		else
		{
			QFile::link(strAppPath, strLinkPath);
		}
        //把程序快捷方式的路径写入注册表
		QString strAutoRunPath = regAutoRun.value(strAppName).toString();// 如果此键不存在,则返回的是空字符串
        if (strAutoRunPath != strLinkPath)
		{
			regAutoRun.setValue(strAppName, strLinkPath);
		}
	}
	else
	{
		regAutoRun.remove(strAppName);
	}
}

2、自启动文件夹方式 

void setExeAutoRun(bool bAutoRun)
{
	QString strAppName = QApplication::applicationName();//程序名称
	QString strAppPath = QDir::toNativeSeparators(QApplication::applicationFilePath());//程序路径
	QString strLinkPath = QDir::toNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation).append("/Startup/").append(strAppName).append(".lnk"));//快捷方式在自启动文件夹中的路径
	if (bAutoRun)
	{
        //在自启动文件夹中创建程序的快捷方式
		if (QFile::exists(strLinkPath))
		{
			QString strSrcAppPath = QDir::toNativeSeparators(QFileInfo(strLinkPath).canonicalFilePath());//快捷方式指向的源程序路径
			if (strSrcAppPath != strAppPath)
			{
				QFile::link(strAppPath, strLinkPath);
			}
		}
		else
		{
			QFile::link(strAppPath, strLinkPath);
		}
	}
	else
	{
		QFile::remove(strLinkPath);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值