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

当我们在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,然后在其消息响应函数中写如下代码:

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)

相关推荐

  • C++中BitBlt的使用方法详解

    BitBlt 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. 原型: BOOL BitBlt( HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop): 参数: hdcDest:指向目标设备环境的句柄. nXDest.nYDest:指定目标矩形区域左上角的X轴和Y轴逻辑坐标 nWidth.

  • C/C++实现控制台输出不同颜色字体的方法

    本文实例讲述了C/C++实现控制台输出不同颜色字体的方法.分享给大家供大家参考,具体如下: 在控制台输出不同颜色的字 效果 代码: #include "stdio.h" #include "windows.h" int main(int argn, char **argv) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN); printf("Hello&q

  • 基于C++的农夫过河问题算法设计与实现方法

    本文实例讲述了基于C++的农夫过河问题算法设计与实现方法.分享给大家供大家参考,具体如下: 问题描述: 一个农夫带着-只狼.一只羊和-棵白菜,身处河的南岸.他要把这些东西全部运到北岸.他面前只有一条小船,船只能容下他和-件物品,另外只有农夫才能撑船.如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜.请求出农夫将所有的东西运过河的方案. 实现上述求解的搜索过程可以采用两种不同的策略:一种广度优先搜索,另一种

  • C++中继承与多态的基础虚函数类详解

    前言 本文主要给大家介绍了关于C++中继承与多态的基础虚函数类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 虚函数类 继承中我们经常提到虚拟继承,现在我们来探究这种的虚函数,虚函数类的成员函数前面加virtual关键字,则这个成员函数称为虚函数,不要小看这个虚函数,他可以解决继承中许多棘手的问题,而对于多态那他更重要了,没有它就没有多态,所以这个知识点非常重要,以及后面介绍的虚函数表都极其重要,一定要认真的理解~ 现在开始概念虚函数就又引出一个概念,那就是重写(覆

  • C++面向对象之多态的实现和应用详解

    前言 本文主要给大家介绍的是关于C++面向对象之多态的实现和应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 多态 大家应该都听过C++三大特性之一多态,那么什么多态呢?多态有什么用?通俗一点来讲-> 多态性可以简单地概括为"一个接口,多种方法",程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念.当多态应用形参类型的时候,可以接受更多的类型.当多态用于返回值类型的时候,可以返回更多类型的数据.多态可以让你的代码拥有更好的扩展性. 多态分

  • C/C++混合编程之extern “C”的使用示例

    前言 本文主要给大家介绍了关于C/C++混合编程extern "C"使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 首先要明白: C++号称是C语言的超集,也确实,从语言的基本语法上,C++是包含所有C语言的语法的,而且C++为了兼容C,连C语言的标准库也被纳入到C++的标准库中,比如在C++中我们仍然可以使用<stdio.h> ,它就是C++标准库的一部分(注意最好用新的标准<cstdio> ,而不是老的<stdio&g

  • c++ 写注册表方式让程序开机自启动

    打开注册表:win+R, 输入regedit 点击确定 你会看到五个根目录,开机自启动的信息写在 HKEY_LOCAL_MACHINE 下面,具体的目录为 SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run 要怎么将开机自启动的信息写入注册表中呢?其实过程很简单,第一步,打开注册表,第二步,写注册表,第三步,关闭键的句柄 打开注册表要使用RegOpenKeyEx 函数 LONGRegOpenKeyEx( HKEYhKey, // 需要打开的主键的名

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

    当我们在window下编写自己的程序时,也可以让自己编写的程序在电脑开机时自动运行,这主要是修改windows里的注册表信息,所有开机自动启动的程序的一些信息都放在注册表中的某一文件夹下.我们只需在特定的文件夹下写入我们的程序信息即可. 关于注册表 我们可以在键盘上同时按下 win+r 键,在运行串口中输regedit 回车即可看到注册表(可以理解为一个大树,记录着系统中的信息),我们点击左边文件夹,点击顺序为:Software\\Microsoft\\Windows\\CurrentVersi

  • Android编程实现应用程序开机自启动的方法

    本文实例讲述了Android编程实现应用程序开机自启动的方法.分享给大家供大家参考,具体如下: Android在开机时自动启动一个应用程序 在启动时自动启动一个应用程序: 1.AndroidManifest.xml <receiver android:enabled="true" android:name=".BootUpReceiver" android:permission="android.permission.RECEIVE_BOOT_COM

  • C#实现程序开机启动的方法

    本文实例讲述了C#实现程序开机启动的方法.分享给大家供大家参考,具体如下: //此方法把启动项加载到注册表中 //获得应用程序路径 string strAssName = Application.StartupPath + @"\" + Application.ProductName + @".exe"; //获得应用程序名 string ShortFileName = Application.ProductName; RegistryKey rgkRun = Re

  • 详解CentOS设置程序开机自启动的方法

    在CentOS系统下,主要有两种方法设置自己安装的程序开机启动. 1.把启动程序的命令添加到/etc/rc.d/rc.local文件中,比如下面的是设置开机启动httpd. #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the fu

  • Jexus开机自动启动配置方法

    Jexus如何配置开机自动启动,具体内容如下 cd /etc/init.d/ vi jws 按i编辑模式,粘贴下面内容 #!/bin/bash #chkconfig: 2345 80 05 #description:jws # . /etc/rc.d/init.d/functions case "$1" in start) echo "Jexus Start.." /usr/jexus/jws start ;; stop) echo "Jexus Stop

  • CentOS7设置jar应用程序开机启动的方法

    项目部署时遇到坑 在部署zhihudemo时,没有用Jenkins这种自动化部署工具,在linux centos中部署jar包项目时遇到一个坑,通过xshell远程连接服务器,在系统中使用"java -jar"命令启动jar包时,输出日志会占据当前终端页面,如果关闭终端窗口的话,整个java程序就将停止,为了解决这个问题,可以将jar包设置为后台服务,并进一步设置为系统服务和开机自启 1. 编写启动脚本 脚本存放位置随意,本例保存在了/etc/rc.d/init.d/file-prev

  • VC++实现程序开机启动运行的方法

    本文所述实例主要介绍如何在VC++下让程序开机自动运行的方法.一般而言添加到开机启动项,这是很多程序都有的做法,具体实现思路是利用win.in文件实现相关程序的开机自动启动.主要是通过WritePrivateProfileString函数来实现.下面来看这一功能的实现方法. 主要功能代码如下: HCURSOR CAutoRunDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CAutoRunDlg::OnBrowse() { //

  • android开机自动启动app的解决方法

    经过多次尝试之后,终于找到了开机自动启动App的解决方法 开机后会停留在锁屏页面,且短时间内如果没有进行解锁操作,屏幕会进入休眠状态,所以启动APP时需要先唤醒屏幕和解锁屏幕 定义一个广播类BootBroadcastReceiver.java public class BootBroadcastReceiver extends BroadcastReceiver {     static final String ACTION = "android.intent.action.BOOT_COMP

  • C#实现将应用程序设置为开机启动的方法

    本文实例讲述了C#实现将应用程序设置为开机启动的方法.分享给大家供大家参考.具体如下: private void WriteRegistry() { string strName = Application.ExecutablePath; if (File.Exists(strName)) { string strNewName = Path.GetFileName(strName); RegistryKey reg = Registry.LocalMachine.OpenSubKey("SOF

  • Android开发之设置开机自动启动的几种方法

    Android开发之设置开机自动启动的几种方法 方法一: <!-- 开机启动 --> <receiver android:name=".AutoStartReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.inten

随机推荐