MFC实现程序开机自启动

把程序设为开机启动,有三种方式:

(1). 把程序增加到注册表的开机运行项,

系统: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

用户: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

需要注意32位程序在64位系统运行,操作注册表被重定向的问题.

(2). 增加执行程序的快捷方式到系统开机启动目录,Windows自动启动放入该文件夹的所有快捷方式

注意WIN7个XP启动目录不一样

WIN7: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

XP:   C:\Documents and Settings\Administrator\「开始」菜单\程序\启动

(3). 把程序设置成服务,通常只把监控进程,守护进程设置成服务

下面介绍方法(1)的实现:

// 设置开机启动
void SetProcAutoRun(const char* szProcFullName/* = ""*/)
{
	BOOL bWOW64 = IsWow64Proc();
	PVOID oldValue = NULL;

	//关闭
	if (bWOW64)
	{
		//关闭WOW64重定向(在导注册表时很重要,避免文件被写到Wow6432Node)
		typedef BOOL(WINAPI *LPFN_Wow64DisableWow64FsRedirection)(PVOID *OldValue);
		LPFN_Wow64DisableWow64FsRedirection fnWow64DisableWow64FsRedirection = NULL;

		fnWow64DisableWow64FsRedirection = (LPFN_Wow64DisableWow64FsRedirection)GetProcAddress(
			GetModuleHandle(TEXT("kernel32")), "Wow64DisableWow64FsRedirection");

		if (fnWow64DisableWow64FsRedirection != NULL)
		{
			fnWow64DisableWow64FsRedirection(&oldValue);
		}
	}

	//修改注册表值
	if (AddRegisterRun(szProcFullName))
	{
		OutputDebugString("Set auto run mode success.");
	}

	if (bWOW64)
	{
		//恢复WOW64重定向
		typedef	BOOL(WINAPI *LPFN_Wow64RevertWow64FsRedirection)(PVOID OlValue);
		LPFN_Wow64RevertWow64FsRedirection fnWow64RevertWow64FsRedirection = NULL;
		fnWow64RevertWow64FsRedirection = (LPFN_Wow64RevertWow64FsRedirection)GetProcAddress(
			GetModuleHandle(TEXT("kernel32")), "Wow64RevertWow64FsRedirection");

		if (fnWow64RevertWow64FsRedirection != NULL)
		{
			fnWow64RevertWow64FsRedirection(oldValue);
		}
	}
}
//修改注册表值
//szProcFullName为进程的全路径文件名
//szProcName为不包含路径的执行文件名
bool AddRegisterRun(const char* szProcFullName)
{
	//打开子键(注册表键不区分大小写)
	HKEY hSubKey = NULL;
	HKEY hKey = HKEY_CURRENT_USER;
	const char* szSubKey = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
	LONG lRet = RegOpenKeyEx(hKey, szSubKey, 0, KEY_ALL_ACCESS, &hSubKey);
	if (lRet != ERROR_SUCCESS)
	{
		return false;
	}

	//查询键值
	DWORD dwType = 0;
	DWORD dwLen = MAX_PATH;
	UCHAR szData[MAX_PATH] = { 0 };
	const char* szQueryKey = szProcName;
	lRet = RegQueryValueEx(hSubKey, szQueryKey, NULL, &dwType, szData, &dwLen);
	if (lRet != ERROR_SUCCESS)
	{
		//创建子键
		lRet = RegSetValueEx(hSubKey, szQueryKey, NULL, REG_SZ, (const BYTE*)szProcFullName, strlen(szProcFullName));
		if (lRet != ERROR_SUCCESS)
		{
			RegCloseKey(hSubKey);
			return false;
		}
	}
	else  //子健存在时,再校验值是否匹配(应为程序绝对路径)
	{
		//键值不相等时需要修改
		if (0 != _stricmp(szProcFullName, (char*)szData))
		{
			//修改键值
			lRet = RegSetValueEx(hSubKey, szQueryKey, NULL, dwType, (const BYTE*)szProcFullName, strlen(szProcFullName));
			if (lRet != ERROR_SUCCESS)
			{
				RegCloseKey(hSubKey);
				return false;
			}
		}
	}

	RegCloseKey(hSubKey);

	return true;
}
时间: 2024-10-13 15:56:22

MFC实现程序开机自启动的相关文章

MFC实现程序开机自启动(II)

很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表 char szProcFullName[MAX_PATH] = { 0 }; ::GetModuleFileName(NULL, szProcFullName, MAX_PATH); HKEY hSubKey = NULL; HKEY hKey = HKEY_CURRENT_USER; const char* szSubKey = TEXT("Software\\Microsoft\\Win

MFC应用程序开机自启动

void CGestureRecognitionDlg::AutoStart(BOOL IsAutoStart) { HKEY hKey; CString strRegPath = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); //找到系统的启动项 if (IsAutoStart) { if (RegOpenKeyEx(HKEY_CURRENT_USER, strRegPath, 0, KEY_ALL_ACCESS,

cenOS设置程序开机自启动的方法

cenOS设置程序开机自启动的方法主要有两种 1.把启动程序的命令添加到/etc/rc.d/rc.local 文件夹中. eg1.设置开机启动mysql vim /etc/rc.d/rc.local #!/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

android 程序开机自启动

今天遇到程序开机自启动,然后查了一下,很简单,就记录一下. 开机自启动,一般我们是开启启动一个广播,然后在广播里启动Activity或者别的服务. 我们要做的很简单,就是在AndroidManifest.xml  里面的广播中添加一行代码 <receiver android:name="广播名称"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED

Windows下通过写注册表的方式实现程序开机自启动

程序可以读取同目录下的config.ini文件中的配置来实现开机自启动. config.ini文件地格式实例如下: [Main] KeyName = test ProcessPath = D:\bin\test.exe 其中KeyName字段为写入注册表的表项名称(可以设置为程序名) ProcessPath为程序的完整路径 程序的完整源代码如下. regedit函数实现注册表写入,autopen实现开机自启动. 编译后的程序在此下载:程序下载 #include <stdio.h> #inclu

C#如何设置程序开机自启动

如果想要将一个exe程序设置为开机自启动,其实就是在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run注册表项中添加一个注册表变量,这个变量的值是程序的所在路径. 具体操作步骤是: 1.使用RegistryKey类的CreateSubKey方法打开HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Ru

linux 让一个程序开机自启动并把一个程序加为服务

本文以tomcat7为例 首先找到tomcat启动的目录,我的为 cd /usr/local/tomcat7/bin/ 这个目录 启动脚本是startup.sh 然后在/etc/rc.d/rc.local 这个文件中将tomcat的启动脚本添加进来即可. 重启操作系统,发现tomcat7可以开机自启动了. 将tomcat添加为服务 将 /usr/local/tomcat7/bin/catalina.sh 这个文件拷贝到 /etc/rc.d/init.d 这个目录并重命名为tomcat 使用命令

程序开机自启动

关于让程序在手机开机的时候自启动,给一个小的Demo 1. [代码]主活动界面 package com.android.antking.startloading; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; public c

设置让程序开机自启动的方法

以下方法均可以让程序开机自启动. 1.    在/etc/rc.d/rc.sysinit 末尾添加命令或要执行的程序脚本该脚本run once at boot time.所以对所有启动级别都有效 2.    在/etc/rc.d/rc.local中添加命令或要执行的程序脚本这个脚本将被执行在所有其他的init脚本执行完成后,默认对2345启动级别有效. 3.    在对应启动级别的/etc/rc.d/rcX.d 做连接文件连接的格式如:ln  -s  /etc/rc.d/init.d/xx  /