我正在用 C++ 开发一个具有“自动启动”选项的应用程序。当用户设置该选项时,程序应该更改 Windows 中的某些内容,以便在下次 Windows 启动和用户登录时由 Windows 启动。此外,当用户取消设置此选项时,程序必须将内容放回原处。
我不需要将应用程序作为服务运行,因此在用户登录后在特定用户的帐户下运行就足够了。那么让 Windows 运行我的应用程序的最佳方法是什么。在下次启动和用户登录时?我在谷歌上搜索了使用启动文件夹的建议。这是最好的和无害的方式吗?
如果是这样,我有两个问题:
- 如何检测启动文件夹。我对 SHGetSpecialFolderLocation() 的输出不满意。它似乎返回了我在测试 WinXP 平台时的“HOME”目录(C:\Documents and settings\%username%)。
- 如何使用 C++ 创建 .lnk 文件?我认为复制整个 .exe 文件不是个好主意。
实际上我的程序是跨平台的,但“自动启动”选项将仅限于 Windows。
更新
尝试了 SHGetSpecialFolderLocation 并在 Windows7 中获得了很好的值(value):“C:\Users\Pavel\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup” 注意:如果您使用 MinGW,则应在包含 ShlObj.h 之前将 _WIN32_IE 定义为 0x0400。
在使用注册表 (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run) 和启动文件夹之间最好的解决方案是什么(从编程的角度来看)?
最佳答案
我建议使用像 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
这样的注册表项。在此处使用您的软件名称和主要可执行路径的值创建一个字符串值 - 这应该足够了。比创建 .lnk 文件容易得多 - 并且可以从 C++ 轻松访问注册表编辑 API
更新:
正如@Ben 所建议的,对于您的任务,最好使用 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
。这只会为当前用户自动启动您的应用程序,而我的第一个建议是为所有用户执行此操作。
更新 2:
另请注意,无论您选择哪种方法来实现自动启动,您都可能会遇到防病毒软件的问题,因为大多数具有主动防御功能的防病毒软件都在密切关注使程序自动运行。
关于Windows 启动时 C++ 应用程序自动运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706892/