C++我们如何让我们的应用程序在计算机启动时启动(当然,在用户登录后)?

Rob*_*ish 4 c++ startup windows-8

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

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

我的操作系统是Windows 8.

但是,我将尝试使我的应用程序可用于所有可能的Window OS.

Cod*_*ray 6

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

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

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

  1. 检索当前用户的Startup文件夹的位置.

    这是通过调用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");
        }                            
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

唯一需要注意的是,实际上有多个Startup文件夹.每个用户都有一个,这是我们上面使用的那个FOLDERID_Startup.大约99%的时间,这就是你想要的那个.为您的应用设置快捷方式会导致该用户登录时自动启动.

但是,还有一个由所有用户共享的全局 Startup文件夹.这个由FOLDERID_CommonStartup(或CSIDL_COMMON_STARTUP)标识,并需要管理权限才能添加项目.当然,这是有道理的,因为无论你输入什么内容都会在任何用户登录计算机时自动启动.只有管​​理员可以影响这样的全局行为.可能的是,你的应用程序无论如何都不需要这个.