Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ How do we make our application start on computer startup (and of course, after a user signed in)?

How do we make our application start on computer startup (and of course, after the user had signed in)? And no, I am not making a virus.

Does registry editing sound like a good idea?

My OS is Windows 8.

However, I will try to make my application available for all possible Window OS.

like image 579
Robert Wish Avatar asked Dec 27 '22 07:12

Robert Wish


1 Answers

The correct way to do this is simply to add a shortcut to your application's executable to the user's Startup folder. You do not need to (and should not) modify the registry.

Advanced users know how to do this manually already, but it may also be an option you want to provide as part of your installer and/or a configuration dialog in your application.

To do this from C++ code, you will need to do two things:

  1. Retrieve the location of the current user's Startup folder.

    This is accomplished by calling the SHGetKnownFolderPath function and specifying the KNOWNFOLDERID of the folder you're interested in. In this case, that would be FOLDERID_Startup.

    Sample code:

    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");
        }                            
    }
    

    Note, however, that while SHGetKnownFolderPath is the recommended function to use, it is supported only by Windows Vista and later. If you need to support older versions of the operating system, you'll need to call it dynamically on newer versions where it is available, and otherwise fall back to calling the SHGetFolderPath function. This one takes a different type of identifier, a CSIDL value. The one you want is CSIDL_STARTUP.

  2. Create a shortcut to your application's executable.

    This is accomplished using a different set of Shell API functions. I won't bother writing up sample code here because it's all quite well explained on MSDN already: Shell Links

    Now you just connect the dots: when you create the shortcut to your application's executable, specify the user's Startup folder as its destination path.

The only other thing to be aware of is that there are actually multiple Startup folders. Each user has one, which is the one we retrieved above using FOLDERID_Startup. About 99% of the time, that's the one you want. Putting a shortcut to your app there will cause it to be launched automatically when that user logs on.

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.

like image 135
Cody Gray Avatar answered Jan 30 '23 06:01

Cody Gray