当我们在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);
函数原型获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。)
1 2 3 4 5 |
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,然后在其消息响应函数中写如下代码:
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; } }点击运行后,出现"启动成功"对话框,重启电脑后,软件开机启动(当运行程序时,有的杀毒软件可能会发出注册表修改的警告,那正是我们的程序在修改注册表)