前言通过代码将要开机自启动的应用的路径信息写入到本地注册表中这样我的应用就可以在重启或者开机后自动启动了。以下为代码演示头文件#include windows.h #include iostream #include string #include fstream #include shlwapi.h #include sstream // 用于 std::istringstream #pragma comment(lib, shlwapi.lib)工具函数宽字符串转窄字符串ANSI// 宽字符串转窄字符串ANSI std::string WStringToString(const std::wstring wstr) { if (wstr.empty()) return ; int len WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); if (len 0) return ; std::string result(len - 1, 0); WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, result[0], len, NULL, NULL); return result; }窄字符串转宽字符串// 窄字符串转宽字符串 std::wstring StringToWString(const std::string str) { if (str.empty()) return L; int len MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); if (len 0) return L; std::wstring result(len - 1, 0); MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, result[0], len); return result; }主体函数获取ini文件中的exe路径// 获取ini文件中的exe路径 std::wstring GetDirectoryFromPath(const std::wstring fullPath) { size_t pos fullPath.find_last_of(L\\/); if (pos ! std::wstring::npos) { return fullPath.substr(0, pos); } return fullPath; }注册与删除// 注册与删除 bool SetAutoStartup(bool enable, const std::wstring appPath L) { HKEY hKey; // Windows API 中用来打开注册表指定键Key的函数 LONG result RegOpenKeyExW( HKEY_CURRENT_USER, LSoftware\\Microsoft\\Windows\\CurrentVersion\\Run, 0, KEY_READ | KEY_WRITE, hKey ); if (result ! ERROR_SUCCESS) { std::cerr 无法打开注册表项错误码: result std::endl; return false; } // 获取当前程序所在目录Release 目录 wchar_t currentExePath[MAX_PATH]; GetModuleFileNameW(NULL, currentExePath, MAX_PATH); std::wstring currentDir GetDirectoryFromPath(currentExePath); if (enable) { // 确定要设置的路径 wchar_t targetPath[MAX_PATH]; if (appPath.empty()) { GetModuleFileNameW(NULL, targetPath, MAX_PATH); } else { wcscpy_s(targetPath, appPath.c_str()); } // 写入注册表 result RegSetValueExW( hKey, LLEDSelfTestProgram, 0, REG_SZ, (BYTE*)targetPath, (wcslen(targetPath) 1) * sizeof(wchar_t) ); if (result ERROR_SUCCESS) { // 使用 cout 输出 std::cout 已设置开机自启: WStringToString(targetPath) std::endl; } else { std::cerr 写入注册表失败错误码: result std::endl; } } else { // 取消自启 result RegDeleteValueW(hKey, LLEDSelfTestProgram); if (result ERROR_SUCCESS) { std::cout 已取消开机自启 std::endl; //// 删除 Release 目录下的配置文件 //std::wstring iniPath currentDir L\\config.ini; //if (PathFileExistsW(iniPath.c_str())) { // DeleteFileW(iniPath.c_str()); // std::cout 已删除配置文件: WStringToString(iniPath) std::endl; //} } else if (result ERROR_FILE_NOT_FOUND) { std::cout 未找到开机自启项 std::endl; } else { std::cerr 删除注册表项失败错误码: result std::endl; } } RegCloseKey(hKey); return result ERROR_SUCCESS; }显示状态// 显示状态 void ShowStatus() { HKEY hKey; LONG result RegOpenKeyExW( HKEY_CURRENT_USER, LSoftware\\Microsoft\\Windows\\CurrentVersion\\Run, 0, KEY_READ, hKey ); if (result ERROR_SUCCESS) { wchar_t value[MAX_PATH]; DWORD dataSize sizeof(value); DWORD dataType 0; result RegQueryValueExW( hKey, LLEDSelfTestProgram, NULL, dataType, (BYTE*)value, dataSize ); if (result ERROR_SUCCESS) { std::wstring path(value); // 清理路径 size_t start path.find_first_not_of(L \t\r\n); if (start ! std::wstring::npos) { path path.substr(start); } size_t end path.find_last_not_of(L \t\r\n); if (end ! std::wstring::npos) { path path.substr(0, end 1); } std::cout 当前开机自启已开启 std::endl; std::cout 启动路径: [ WStringToString(path) ] std::endl; // 检查文件是否存在 DWORD attrs GetFileAttributesW(path.c_str()); if (attrs ! INVALID_FILE_ATTRIBUTES) { // 判断是文件还是文件夹 if (attrs FILE_ATTRIBUTE_DIRECTORY) { std::cout 注意: 这是一个文件夹不是可执行文件 std::endl; } else { std::cout 目标文件存在 std::endl; } } else { std::cout 警告: 目标文件不存在 std::endl; } } else { std::cout 当前未设置开机自启 std::endl; } RegCloseKey(hKey); } }读本地INI配置std::wstring ReadConfigPath(const std::wstring currentDir) { std::wstring iniPath currentDir L\\config.ini; if (!PathFileExistsW(iniPath.c_str())) { return L; // 配置文件不存在 } // 改用二进制方式读取避免编码转换问题 std::ifstream iniFile(WStringToString(iniPath).c_str(), std::ios::binary); if (!iniFile.is_open()) { return L; } // 读取整个文件内容 std::string content((std::istreambuf_iteratorchar(iniFile)), std::istreambuf_iteratorchar()); iniFile.close(); // 检测并去除 UTF-8 BOM如果存在 if (content.size() 3 (unsigned char)content[0] 0xEF (unsigned char)content[1] 0xBB (unsigned char)content[2] 0xBF) { content content.substr(3); } // 按行分割 std::istringstream iss(content); std::string line; while (std::getline(iss, line)) { // 去除 Windows 换行符 \r if (!line.empty() line.back() \r) { line.pop_back(); } // 查找 StarAppPath 不区分大小写 std::string searchKey StarAppPath; // 转小写比较不区分大小写 std::string lowerLine line; for (char c : lowerLine) { c tolower(c); } std::string lowerKey starapppath; if (lowerLine.find(lowerKey) 0) { // 提取等号后面的内容 std::string pathStr line.substr(searchKey.length()); // 去除首尾空格 size_t start pathStr.find_first_not_of( \t\r\n); size_t end pathStr.find_last_not_of( \t\r\n); if (start ! std::string::npos end ! std::string::npos) { pathStr pathStr.substr(start, end - start 1); } // 去除首尾的双引号 if (!pathStr.empty() pathStr.front() ) { pathStr pathStr.substr(1); } if (!pathStr.empty() pathStr.back() ) { pathStr pathStr.substr(0, pathStr.length() - 1); } // 将路径中的 / 替换为 \Windows 标准 for (char c : pathStr) { if (c /) c \\; } // 关键修改先尝试用 UTF-8 解码 int len MultiByteToWideChar(CP_UTF8, 0, pathStr.c_str(), -1, NULL, 0); if (len 0) { std::wstring result(len - 1, 0); MultiByteToWideChar(CP_UTF8, 0, pathStr.c_str(), -1, result[0], len); return result; } // 如果 UTF-8 解码失败回退到 ANSIGBK return StringToWString(pathStr); } } return L; }Main函数int main() { // 设置控制台编码为 GBK SetConsoleOutputCP(936); //SetConsoleOutputCP(CP_UTF8); //SetConsoleCP(CP_UTF8); // 获取当前目录Release 目录 wchar_t currentPath[MAX_PATH]; GetModuleFileNameW(NULL, currentPath, MAX_PATH); std::wstring currentDir GetDirectoryFromPath(currentPath); std::cout std::endl; std::cout LED Self Test Program - 启动管理 std::endl; std::cout std::endl; std::wstring path ReadConfigPath(currentDir); std::cout 当前目录: WStringToString(path) std::endl; std::cout std::endl; ShowStatus(); std::cout std::endl; std::cout 请选择操作: std::endl; std::cout 1 - 开启开机自启 std::endl; std::cout 2 - 取消开机自启 std::endl; std::cout 3 - 查看状态 std::endl; std::cout 0 - 退出 std::endl; std::cout 请输入: ; int choice; std::cin choice; switch (choice) { case 1: { std::wstring targetApp path/*currentDir L\\myapp.exe*/; std::cout 目标应用: WStringToString(targetApp) std::endl; std::cout 确认设置? (y/n): ; char confirm; std::cin confirm; if (confirm y || confirm Y) { SetAutoStartup(true, targetApp); } else { std::cout 已取消操作 std::endl; } break; } case 2: SetAutoStartup(false); break; case 3: ShowStatus(); break; case 0: std::cout 退出程序 std::endl; break; default: std::cout 无效输入 std::endl; } std::cout std::endl; system(pause); return 0; }效果演示本地INI配置文件WinR搜索regedit按照HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run查找文件夹总结以下为使用到的注册表 API 都是标准的 Windows 注册表操作函数涵盖了打开 → 增/删/查 → 关闭的完整流函数作用在你的代码中的用途RegOpenKeyExW打开一个注册表键打开HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run获取句柄用于后续操作RegSetValueExW在注册表键下设置/写入一个值写入LEDSelfTestProgram项值为要开机启动的程序路径RegDeleteValueW从注册表键中删除一个值删除LEDSelfTestProgram项取消开机自启RegQueryValueExW查询注册表键下某个值的数据查询LEDSelfTestProgram的值用于显示当前开机自启状态RegCloseKey关闭打开的注册表键句柄每次操作完成后关闭hKey防止资源泄漏
企业数字化 ERP 产品动态
相关推荐
AI大模型开发:高薪程序员的技术转型指南 1. AI大模型技术为何成为程序员的高薪赛道过去五年里,AI大模型技术从实验室走向产业应用,创造了大量高价值岗位。根据行业调研数据,掌握大模型开发能力的工程师薪资普遍比传统开发岗位高出30-50%,顶尖算法人才年薪可达百万级别。这… · 2026/9/15 4:22:05
IDCNN模型在命名实体识别中的高效应用与优化 1. IDCNN模型在NER任务中的核心价值命名实体识别(NER)作为自然语言处理的基础任务,其核心挑战在于如何有效捕捉文本中的长距离依赖关系。传统CNN模型受限于固定感受野,在处理这类问题时往往力不从心。IDCNN(Iterated D… · 2026/9/11 23:21:40
Moneta亿汇:客户支持与执行效率如何影响体验,给出一套逻辑 外汇市场信息更新频繁,平台口碑的形成更依赖长期一致性:入口是否好找、说明是否前后一致、提示是否稳定出现。围绕Moneta亿汇,下面从稳定体验与信息呈现等角度做一次正面观察。在外汇相关服务中,读者最在意的通常是信息是否清楚、… · 2026/9/16 14:33:33
高防IP防护链路拆解:从流量清洗到智能调度 很多人第一次接触高防IP,下意识会觉得这是一台“特别能扛打的大带宽服务器”。这个理解不算错,但只看到了结果,没看到过程。一个真正扛得住上百Gbps攻击的高防IP,背后其实是流量检测、流量牵引、清洗处置、回源转发、智能调度整套… · 2026/9/25 11:39:08
Themida/WinLicense脱壳实战:OEP定位与IAT修复工具链 简介:该资源为 Themida/WinLicense V1.8.X-V2.X 的专用脱壳工具包,专注解决加壳软件在授权校验、反调试及代码虚拟化方面的保护问题,可辅助用户高效去除壳层并还原可用分析代码,主要面向软件逆向工程师、安全分析人员及有一定调试… · 2026/9/25 11:39:02
Photoshop改尺寸不糊指南:图像大小、画布大小、裁剪与导出全解析 在修图这件事上,尺寸调整看似是最基础的操作,但我见过太多人栽在这一步。有人把手机拍的40003000照片直接拖进电商详情页模板,结果主体糊成一团;有人为了发朋友圈把图缩到800像素宽,回头想打印时发现原图已经覆盖保存&… · 2026/9/25 11:38:56
微信PC多开防撤回技术原理深度解析 1. 这个“多开防撤回版”到底是什么东西?先说清楚它不是什么最近在各种技术论坛、软件分享站和群文件里,频繁刷到“微信最新PC版 v4.1.15.09 多开防撤回版”这类标题。很多人第一反应是:终于能像QQ一样开多个微信窗口了?还能看到别… · 2026/9/25 11:38:56
Kali Linux WiFi渗透实战:从监听模式到握手包破解 说到 Kali,很多新手的第一个反应就是“这系统挺牛,好像能搞 WiFi 密码”。我在网络安全这条路上走了差不多十年,工具越用越多,但每次带新人入门,我都会先把这句话说清楚:Kali 本身只是一把工具,… · 2026/9/25 11:38:56
sinon sandbox.stub() 完全指南:非函数属性 Stubbing 与自动恢复 测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 本文围绕 Sinon 沙箱(Sandbox)API 中的 sandbox.stub() 方法展开,讲解… · 2026/9/25 11:38:49
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37