获取 Windows 上所有用户的开始菜单的路径
Get path to all users' start menu on Windows
我正在寻找一种在c++中检索所有用户开始菜单目录的路径的方法。我只能得到当前用户的一个(使用Qt):
QString startMenuPath = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).at(0);
然而,Qt不允许为所有用户检索一个。据我所知,也没有包含该路径的环境变量,我可以读取
要获得已知文件夹,使用SHGetFolderPath
,并为所需文件夹传递KNOWNFOLDERID
或CSIDL
。
例如,以下代码获取All Users Start Menu
和Programs
文件夹:
// 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 MenuPrograms: " << path << std::endl;
hr = SHGetFolderPathW(NULL, CSIDL_COMMON_STARTMENU, NULL, 0, path);
if (SUCCEEDED(hr))
std::wcout << L"Start Menu: " << path << std::endl;
感谢用户theB提供的解决方案。下面是我在Windows的所有用户开始菜单中创建快捷方式的最后一段代码(使用Qt):
#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;
}
任何用户的开始菜单的路径都将是(在Windows 7上)
C:Users
username
AppDataRoamingMicrosoftWindows开始菜单
对于所有用户开始菜单(在Windows 7中),它是
C: ProgramData 微软 Windows 开始菜单
但是,只有管理员和用户自己可以不受限制地访问每个用户的文件夹;其他所有人都将缺乏读/写权限。您可以通过以管理员身份运行程序来规避这个问题,但是您可能希望重新考虑您的程序设计,因为依赖于对系统管理文件夹的访问的解决方案在设计上是不稳定的。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 无法获取菜单选择以运行函数.C++
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 如何从头开始创建 avi 文件?
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 自一周开始以来的秒数?
- 一旦双簧管录制开始,主 UI 线程就会被阻止
- GStreamer在开始任何播放之前进行搜索
- COM 外壳扩展以覆盖"Run as Administrator"在"开始"菜单搜索中失败
- 如何检测Windows开始菜单/开始屏幕何时打开
- 在Windows8中从开始菜单切换到桌面
- 在窗口开始菜单中创建快捷方式
- 如何让 cpack 生成正确的开始菜单快捷方式
- 触摸开始时更改菜单项目标签颜色
- C++:如何在Windows的「开始」菜单中创建快捷方式
- 获取 Windows 上所有用户的开始菜单的路径
- 如何检测windows8.1的开始菜单
- c++ Windows开始菜单Internet快捷方式工具提示
- 如何添加计算器开始菜单搜索
- Windows API创建快捷方式,并把应用程序在开始菜单