C++应用程序自动运行在Windows启动

问题描述:

我正在开发一个应用程序在C++中有一个选项“自动启动”。当用户设置该选项时,程序应在Windows中更改,以便在Windows启动和用户登录时由Windows启动。此外,当用户取消设置该选项时,该程序必须重新启动。C++应用程序自动运行在Windows启动

我不需要运行应用程序作为服务,所以它足以在用户登录后在某个用户的帐户下运行。那么让Windows运行我的应用程序的最佳方式是什么?在下次启动和用户登录?我搜索了一个使用启动文件夹的建议。这是最好的和无害的方式?

如果是这样,我有2个问题:

  1. 如何检测启动文件夹。我不喜欢SHGetSpecialFolderLocation()的输出。它似乎在测试WinXP平台(C:\ Documents and Settings \%username%)时返回我的“HOME”目录。
  2. 如何使用C++创建.lnk文件?我认为复制整个.exe文件是不好的主意。

其实我的程序是跨平台的,但是“自动启动”选项只能用于windows。

更新

  1. 尝试SHGetSpecialFolderLocation并在Windows7中得到了良好的价值: “C:\用户\帕维尔\应用程序数据\漫游\微软\的Windows \开始菜单\程序\启动” 注意:如果你使用MinGW,你应该在包含ShlObj.h之前将_WIN32_IE定义为0x0400。

  2. 什么是使用注册表(HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run)和启动文件夹之间的最佳解决方案(在观点良好的编程)?

+1

对于所有用户或只是当前登录的用户? –

我建议使用注册表项,如HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run。在这里用您的软件名称和主要可执行文件路径的值创建一个字符串值 - 这应该就足够了。要容易得多然后创建一个.lnk文件 - 和注册表编辑API是交通方便,距C++

UPDATE:

由于@Ben建议,您的任务是更好地使用HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run。这将只为当前用户自动启动您的应用,而我的第一个建议将为所有用户执行此操作。

UPDATE2:

另外请注意,任何你选择实现自动启动,你可能会得到与杀毒软件最具有主动防御反病毒软件的正在密切关注有关使程序自动运行的问题。

+3

更好:在HKEY_CURRENT_USER而不是HKLM下执行。 –

+0

@当然不同的意思,但不是所有的立场更好? –

+0

@ BenVoigt:你是对的;相应更新了我的答案。 –

要明确起见,启动文件夹项目发生在登录时,不启动。这听起来像你想要的,我只想直接得到这些条款。

我想你其实想要SHGetSpecialFolderPathCSIDL_STARTUP不变。如果我正确阅读文档,应该给你想要的路径。

使用SHGetSpecialFolderPath确定启动文件夹的路径(请参阅Michael Kohne的答案)。

然后使用IShellLink为了在此文件夹中创建一个快捷方式。

编辑:我认为使用注册表中的运行键更可靠。