4

我们如何让我们的应用程序在计算机启动时启动(当然,在用户登录之后)?不,我没有制造病毒。

注册表编辑听起来是个好主意吗?

我的操作系统是 Windows 8。

但是,我将尝试使我的应用程序可用于所有可能的 Window 操作系统。

4

5 回答 5

6

执行此操作的正确方法是将应用程序可执行文件的快捷方式添加到用户的启动文件夹。您不需要(也不应该)修改注册表。

高级用户已经知道如何手动执行此操作,但它也可能是您希望在安装程序和/或应用程序中的配置对话框中提供的选项。

要从 C++ 代码执行此操作,您需要做两件事:

  1. 检索当前用户的启动文件夹的位置。

    这是通过调用SHGetKnownFolderPath函数并指定KNOWNFOLDERID您感兴趣的文件夹来完成的。在这种情况下,就是FOLDERID_Startup.

    示例代码:

    std::wstring GetStartupFolderPath()
    {
        PWSTR pszPath;
        HRESULT hr = SHGetKnownFolderPath(&FOLDERID_Startup,
                                          0,     // no special options required
                                          NULL,  // no access token required
                                          &pszPath);
        if (SUCCEEDED(hr))
        {
            // The function succeeded, so copy the returned path to a
            // C++ string, free the memory allocated by the function,
            // and return the path string.
            std::wstring path(pszPath);
            CoTaskMemFree(static_cast<LPVOID>(pszPath));
            return path;
        }
        else
        {
            // The function failed, so handle the error.
            // ...
            // You might want to throw an exception, or just return an
            // empty string here.
            throw std::runtime_error("The SHGetKnownFolderPath function failed");
        }                            
    }
    

    但是请注意,虽然SHGetKnownFolderPath是推荐使用的功能,但它仅受 Windows Vista 及更高版本支持。如果您需要支持旧版本的操作系统,则需要在可用的新版本上动态调用它,否则回退到调用该SHGetFolderPath函数。这一个采用不同类型的标识符,即CSIDL值。你想要的是CSIDL_STARTUP.

  2. 创建应用程序可执行文件的快捷方式。

    这是使用一组不同的 Shell API 函数完成的。我不会在这里编写示例代码,因为它已经在 MSDN 上得到了很好的解释:Shell Links

    现在您只需连接点:当您创建应用程序可执行文件的快捷方式时,将用户的 Startup 文件夹指定为其目标路径。

唯一需要注意的是实际上有多个启动文件夹。每个用户都有一个,这是我们在上面使用 检索到的那个FOLDERID_Startup。大约 99% 的时间,这就是你想要的。将应用程序的快捷方式放在那里将导致该用户登录时自动启动它。

However, there is also a global Startup folder that is shared by all users. This one is identified by FOLDERID_CommonStartup (or CSIDL_COMMON_STARTUP) and requires administrative privileges to add items to. That makes sense, of course, because whatever you put in there is going to launch automatically when any user logs on to the computer. Only administrators can affect global behavior like this. And chances are, your app doesn't need this anyway.

于 2013-03-22T21:50:00.397 回答
3

开始菜单

最简单的解决方案是将.lnk文件.bat放入Start Menu\On startup文件夹中。这是最简单的,并且对用户来说不太偷偷摸摸。

注册表:

另一种解决方案是在注册表项中创建密钥:

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]   //All users
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]  //All users once 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]  //Currend user
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce] //Current user once

这不是那么透明 - 所以对用户更具侵略性。

于 2013-03-22T21:16:07.230 回答
1

在 Windows 上,您可以将应用程序的快捷方式放在Startup文件夹中,也可以将其作为服务实现。

而“我没有制造病毒”确实让你听起来很内疚......也许它是一个键盘记录器?;)

于 2013-03-22T21:18:40.967 回答
0

有很多方法,但它们都取决于您的操作系统。对于 Windows,请查看控制面板中“管理工具”下的“任务计划程序”。

于 2013-03-22T21:16:03.010 回答
0

也许是这样的?请注意,此代码段不是我编写的。

#include <windows.h>

void Reg() {
    ::HKEY Handle_Key = 0;
    ::DWORD Dispoition = 0;

    ::RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                    "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                    0,
                    KEY_ALL_ACCESS,
                    &Handle_Key );
    const unsigned char Path[ MAX_PATH ] = "C:\\Windows\\YourProgramName.exe";
    ::RegSetValueEx( Handle_Key, "My Directory", 0, 1, Path, sizeof( unsigned char ) );
};

你们有什么感想?

于 2013-03-22T21:31:29.263 回答