00 函数介绍
SHGetSpecialFolderPath 函数
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
暂无评论内容