如何让程序开机自动启动

当我们在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;
    }
}

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

时间: 2024-11-06 09:42:21

如何让程序开机自动启动的相关文章

VS2012+C语言+设置程序开机自动启动+示例

#include <stdio.h> #include <windows.h> #include <stdlib.h> char* ReplaceString(const char *srcStr, const char *src, const char *dest) //替换字符串,获得文件路径 { char *ptr; int len = strlen(srcStr); ptr = (char*)malloc(sizeof(char)*len+1); strcpy(

java实现软件程序开机自动启动和创建程序的桌面快捷方式源代码

一.java实现.exe程序的开机自动启动 1.描述 自己在eclipse编写的java项目用exe4j Wizard打包成一个.exe可执行文件,并让用户可以开机自动启动. 2.步骤 1.   获得本软件中.exe可执行文件的路径 2.   在Windows系统中的开机启动栏存放该.exe可执行文件的快捷方式,即可实现开机自动启动. 3.代码 private void startFolderMethod() { String path = System.getProperty("user.di

巧妙地利用进程分离来设置程序开机自动启动!(附源码)

在GG(高仿QQ)最早的版本中,我就加入了开机自动启动的功能,是通过操作注册表来实现的,但是操作注册表需要管理员权限,这样,就表示必须以管理员的身份来运行GG客户端.这对某些用户来说可能接受不了,因为以这么高的权限来运行一个程序,用户会觉得风险较大.而就从GG的角度来说,也只有在设置或取消开机启动才需要这个权限,而一开始就以管理员身份运行GG,就有点太夸张和浪费了. 一.方案进化 我开始想到的解决方案是,仍然以普通用户的身份启动GG,当需要操作注册表时,再提升至管理员权限.后来通过查资料了解到:

C#/WPF让程序开机自动启动

最近一个C/S项目客户要求开机自启的功能,网上找了一些方法,不顶用:最后自己去翻书,找到了这段代码,亲测可用,Wpf环境下需要改下获取程序目录的方式即可,Winform直接可用. 1 #region 设置开机自启 2 string strName = AppDomain.CurrentDomain.BaseDirectory + "AutoRunPro.exe";//获取要自动运行的应用程序名 3 if (!System.IO.File.Exists(strName))//判断要自动运

关于C# Winform 程序开机自动启动

1.程序运行时调用下面方法即可. /// <summary> /// 设置开机自动启用 /// </summary> private void SetAutoStart() { try { string regPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";//注册表 string path = Application.ExecutablePath.ToLower(); //获取.exe当前程

使用.bat批处理文件开机自动启动程序

我们不希望所有程序开机自动启动 , 因为我们有时需要一开机直接运行我们想使用的软件 , 却因为开机自启软件电脑开机速度被拖慢 , 我们有时候又需要开机自动启动 . 所以我教大家如何实现 . 首先关闭所有开机自启程序: win+x , t 运行task manager 在开机启动一栏, 关闭所有自启程序 下面 , 我们写一个.bat文件 , 以便随时自动启动程序 win+R,notepad , enter 输入以下代码 , 由于程序路径不同 , 你在使用时修改路径即可 , 对于最后一个启动项 ,

Android怎么让一个service开机自动启动

1.首先开机启动后系统会发出一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED,这个Action只会发出一次. 2.构造一个IntentReceiver类,重构其抽象方法onReceiveIntent(Context context, Intent intent),在其中启动你想要启动的Service. 3.在AndroidManifest.xml中,首先加入<uses-permission android:na

在Linux系统如何让程序开机时自动启动

核心提示:系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统"开始"-->"所有程序"-->"启动"里面放个快捷方式就行,那Linux系统下呢?...系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统"开始"-->"所有程序"-->&qu

批处理+VBS+注册表实现开机自动启动EXE程序

批处理+VBS+注册表实现WINDOWS开机自动启动EXE程序 以下都是基于WINDOWS系统. 我们都知道当我们有想某个程序在开机时自动运行,只能有三个方式: 1.做成服务,然后对服务进行配置为自动启动(可以实现不进行用户登录完成): 2.做成驱动程序,随系统启动(可以实现不进行用户登录完成): 3.做成EXE程序,添加到开机启动项(必须得在用户登录情况下完成). 而我现在要解决的就是第三种情况 我有个想开机自动启动EXE的需求,而由于某些原因这个EXE短时间内无法做成服务,所以网上找了下方法