Windows 自启动 之 快速启动目录

00 函数介绍

SHGetSpecialFolderPath 函数

https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetspecialfolderpathw

BOOL SHGetSpecialFolderPathW(
        HWND   hwnd,
  [out] LPWSTR pszPath,
  [in]  int    csidl,
  [in]  BOOL   fCreate
);

01 实现原理

快速启动目录是一种不用修改任何系统数据,并且实现起来最为简单的开机自启动方法。只要把程序放入快速启动文件夹中,系统在启动时就会自动加载并运行相应的程序,实现开机自启动功能。

不过对于不同的计算机启动目录都是不一样的,原因是因为进入Users这个目录之后,账户的名称都不相同,默认情况下快速启动的路径在C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,如图所示,我们将自己的exe放到这个目录下即可

快速切换 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup

快速启动目录并不是一个固定目录,每台计算机的快速启动目录都不相同。但是程序可以使用 SHGetSpecialFolderPath 函数获取Windows系统中快速启动目录的路径,快速启动目录的CSIDL标识值为CSIDL STARTUP。

然后,使用CopyFile函数,将想要自启动的程序复制到快速启动目录下即可。当然,为程序创建快捷方式,并把快捷方式放入到快速启动目录中,也同样可以达到开机自启动的效果。

02 实现代码

#include <iostream>
#include <Windows.h>
#include <shlobj_core.h>

using namespace std;

DWORD AutoSetup(const char* lpszSrcFilePath, const char* lpszDestFileName)
{
	CHAR szStartupPath[MAX_PATH] = { 0 };
	CHAR szDestFilePath[MAX_PATH] = { 0 };

	if (FALSE == ::SHGetSpecialFolderPathA(NULL, szStartupPath, CSIDL_STARTUP, TRUE))
	{
		printf("[!] Get szStartupPath failed, error is : %d\n\n", GetLastError());
		return FALSE;
	}
	else
	{
		printf("[*] The szStartupPath is : %s\n\n", szStartupPath);
	}

	::wsprintfA(szDestFilePath, "%s\\%s", szStartupPath, lpszDestFileName);

	if (FALSE == ::CopyFileA(lpszSrcFilePath, szDestFilePath, FALSE))
	{
		printf("[!] CopyFile failed, error is : %d\n\n", GetLastError());
		return FALSE;
	}
	else
	{
		printf("[*] CopyFile successfully!\n\n");
	}

	return TRUE;
}

int main()
{
	const char* lpszSrcFilePath = "C:\\MyCode\\CPlus\\test.exe";
	const char* lpszDestFileName = "test1.exe";
	AutoSetup(lpszSrcFilePath, lpszDestFileName);
}
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情快捷回复

    暂无评论内容