首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取Windows上所有用户开始菜单的路径

获取Windows上所有用户开始菜单的路径
EN

Stack Overflow用户
提问于 2015-10-12 20:49:58
回答 3查看 2.2K关注 0票数 0

我正在寻找一种方法,以检索路径的所有用户开始菜单目录中的C++。我只能获得当前用户中的一个(使用Qt):

代码语言:javascript
复制
QString startMenuPath = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).at(0);

但是,Qt不允许为所有用户检索。据我所知,也没有环境变量包含该路径,我可以阅读。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-12 21:23:54

若要获取已知文件夹,请使用SHGetFolderPath,并为所需文件夹传递一个KNOWNFOLDERIDCSIDL

例如,下面的代码获取所有用户Start MenuPrograms文件夹:

代码语言:javascript
复制
// Remember to #include <Shlobj.h>

WCHAR path[MAX_PATH];

HRESULT hr = SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, path);
if (SUCCEEDED(hr))
    std::wcout << L"Start Menu\Programs: " << path << std::endl;

hr = SHGetFolderPathW(NULL, CSIDL_COMMON_STARTMENU, NULL, 0, path);
if (SUCCEEDED(hr))
    std::wcout << L"Start Menu: " << path << std::endl;
票数 6
EN

Stack Overflow用户

发布于 2015-10-13 13:56:24

感谢用户theB的解决方案。这里是我在Windows上的“所有用户开始”菜单中创建快捷方式的最后一段代码(使用Qt):

代码语言:javascript
复制
#include <shlobj.h>

bool createStartMenuEntry(QString targetPath) {
    targetPath = QDir::toNativeSeparators(targetPath);

    WCHAR startMenuPath[MAX_PATH];
    HRESULT result = SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, startMenuPath);

    if (SUCCEEDED(result)) {
        QString linkPath = QDir(QString::fromWCharArray(startMenuPath)).absoluteFilePath("Some Link.lnk");

        CoInitialize(NULL);
        IShellLinkW* shellLink = NULL;
        result = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLinkW, (void**)&shellLink);
        if (SUCCEEDED(result)) {
            shellLink->SetPath(reinterpret_cast<LPCWSTR>(targetPath.utf16()));
            shellLink->SetDescription(L"Description");
            shellLink->SetIconLocation(reinterpret_cast<LPCWSTR>(targetPath.utf16()), 0);

            IPersistFile* persistFile;
            result = shellLink->QueryInterface(IID_IPersistFile, (void**)&persistFile);

            if (SUCCEEDED(result)) {
                result = persistFile->Save(reinterpret_cast<LPCOLESTR>(linkPath.utf16()), TRUE);

                persistFile->Release();
            } else {
                return false;
            }
            shellLink->Release();
        } else {
            return false;
        }
    } else {
        return false;
    }
    return true;
}
票数 2
EN

Stack Overflow用户

发布于 2015-10-12 21:22:07

指向任何用户的“开始”菜单的路径将为(在Windows 7上)

C:\Users`username`\AppData\Roaming\Microsoft\Windows\Start菜单

对于所有用户开始菜单(在Windows 7中),它是

C:\ProgramData\Microsoft\Windows\Start菜单

但是,只有管理员和用户自己可以不受限制地访问每个用户的文件夹;其他每个人都将缺乏读/写权限。您可以通过以管理员身份运行程序来规避此问题,但您可能希望重新考虑您的程序设计,因为依赖于对系统管理文件夹的访问的解决方案在设计上将是不稳定的。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33089959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档