c++ 让程序开机自动启动的方法

2025-05-27 0 30

当我们在window下编写自己的程序时,也可以让自己编写的程序在电脑开机时自动运行,这主要是修改windows里的注册表信息,所有开机自动启动程序的一些信息都放在注册表中的某一文件夹下。我们只需在特定的文件夹下写入我们的程序信息即可。

关于注册表 我们可以在键盘上同时按下 win+r 键,在运行串口中输regedit 回车即可看到注册表(可以理解为一个大树,记录着系统中的信息),我们点击左边文件夹,点击顺序为:Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run,在这个文件夹中存放的便是随机启动的 程序的信息。举个例子:当我们使用某个电脑优化软件进行电脑优化时,他会检测到需要开机优化的项目,即有些软件不必要开机就启动,修改的就是这个文件中的一些信息。

首先我们解释下所用到的函数的含义:

RegOpenKeyEx()

函数功能描述:打开一个指定的注册表键
原型

LONG RegOpenKeyEx(
HKEY hKey, // 需要打开的主键的名称
LPCTSTR lpSubKey, //需要打开的子键的名称
DWORD ulOptions, // 保留,设为0
REGSAM samDesired, // 安全访问标记,也就是权限
PHKEY phkResult // 得到的将要打开键的句柄
)
Parameters
参数:
hKey
入参,标识当前被 RegCreateKeyEx 或RegOpenKeyEx打开的注册表键的句柄,或者是以下预定义的句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS


lpSubKey
入参,该参数指向一个字符串,该字符串用来保存将要打开的注册表名称。如果这个参数是空,或者是一个指向空串的指针,该函数将会打开一个由hKey所定义的键,在此种情况下,该函数不会关闭舷墙已经打开的句柄。

ulOptions
入参,保留,设置为0

samDesired
入参。标识打开注册表的权力,如果该参数的安全描述符不容许当前进程访问注册表,则该函数会返回失败。此程序中我们使用写入参数即:KEY_WRITE (0x20006)。

phkResult
出参,指向一个变量的指针,该变量用来保存打开注册表键的句柄。如果不再使用返回的句柄,则调用RegCloseKey来关闭它。

返回值:
ERROR_SUCCESS表示该函数执行成功,非零值表示该函数执行失败。想要获得错误描述,调用FormatMessage函数,并传入FORMAT_MESSAGE_FROM_SYSTEM参数。

二:
GetModuleFileName(NULL,pFileName, MAX_PATH);
函数原型获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。)

DWORDGetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
);
HMODULE hModule: 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序的全路径。
lpFileName: 是你存放返回的名字的内存块的指针,是一个输出参数。
DWORD nSize:装载到缓冲区lpFileName的最大值。

注意:如果想获得某个正在运行的EXE或者DLL的全路径可以这样写代码
GetModuleFileNameEx(hProcess,hInst,lpFile,MAX_PATH);//注意下缓冲区就行了。

三:

RegSetValueEx():想要设置的注册表项下不是默认值,即有名称值的数据和类型时,可以调用RegSetValueEx函数,该函数将在注册表项下设置指定值的数据和类型。

LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
hKey: 一个已打开项的句柄
lpValueName:指向一个字符串的指针,该字符串包含了欲设置值的名称。若拥有该值名称的值并不存在于指定的注册表项中,则此函数将其加入到该项。
Reserved:保留值,必须强制为0
dwType: 指定将被存储的数据类型
lpData: 指向一个缓冲区,该缓冲区包含了欲为指定值名称存储的数据。
cbData:指定由lpData参数所指向的数据的大小,单位是字节。

以下代码时实现让本程序开机自启的方法.
我们建立个对话框程序,在对话框上放一个button,然后在其消息响应函数中写如下代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32
void CSetAutoRunDlg::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

HKEY hKey; //可以理解为操作注册表的句柄

//找到系统的启动项 ,长指针类型是const char * 类型

LPCTSTR lpRun = "Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run";

//打开启动项Key

long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);

if(lRet == ERROR_SUCCESS) //打开成功

{

char pFileName[MAX_PATH] = {0}; //定义数组存放路径

//得到程序自身的全路径

DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);

//添加一个子Key,并设置值 // 下面的"test"是应用程序名字(不加后缀.exe)

lRet = RegSetValueEx(hKey, "SetAutoRun", 0, REG_SZ, (BYTE *)pFileName, dwRet);

//关闭注册表

RegCloseKey(hKey);

if(lRet != ERROR_SUCCESS)

{

MessageBox("系统参数错误,不能完成开机启动设置");

}

else

{

MessageBox("打开开机启动成功");

}

// isrun = 1;

}

}

点击运行后,出现"启动成功"对话框,重启电脑后,软件开机启动(当运行程序时,有的杀毒软件可能会发出注册表修改的警告,那正是我们的程序在修改注册表)

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 c++ 让程序开机自动启动的方法 https://www.kuaiidc.com/73283.html

相关文章

发表评论
暂无评论