伙计们。 我想用c++获取桌面上的图标名称。我知道如何获取他们的句柄:
HWND hwnd = FindWindow("Progman","Program Manager");
HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwnd, NULL, "SHELLDLL_DefView", NULL );
HWND hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );
下一步是什么?
首先,您需要使用 SHGetFolderLocation 获取桌面文件夹的位置。接下来,您使用 IShellFolder::EnumObjects
枚举此文件夹的内容从这里开始,天空才是极限。有关与 Windows shell 交互的大量信息此处。
玩得开心!
更新:
快速谷歌搜索会出现这个示例,它似乎完全符合您的要求。
以下代码将桌面上每个图标的名称打印到控制台。代码很大程度上基于 Raymond Chen 的 操纵桌面图标的位置。
#include <windows.h>
#include <shlobj.h>
#include <atlbase.h>
// Class to help with object destruction
// https://devblogs.microsoft.com/oldnewthing/20040520-00/?p=39243
class CCoInitialize {
public:
CCoInitialize() : m_hr(CoInitialize(NULL)) { }
~CCoInitialize() { if (SUCCEEDED(m_hr)) CoUninitialize(); }
operator HRESULT() const { return m_hr; }
HRESULT m_hr;
};
// Get shell view for the desktop
// https://devblogs.microsoft.com/oldnewthing/20130318-00/?p=4933
void FindDesktopFolderView(REFIID riid, void** ppv)
{
CComPtr<IShellWindows> spShellWindows;
spShellWindows.CoCreateInstance(CLSID_ShellWindows);
CComVariant vtLoc(CSIDL_DESKTOP);
CComVariant vtEmpty;
long lhwnd;
CComPtr<IDispatch> spdisp;
spShellWindows->FindWindowSW(
&vtLoc, &vtEmpty,
SWC_DESKTOP, &lhwnd, SWFO_NEEDDISPATCH, &spdisp);
CComPtr<IShellBrowser> spBrowser;
CComQIPtr<IServiceProvider>(spdisp)->
QueryService(SID_STopLevelBrowser,
IID_PPV_ARGS(&spBrowser));
CComPtr<IShellView> spView;
spBrowser->QueryActiveShellView(&spView);
spView->QueryInterface(riid, ppv);
}
int main()
{
CCoInitialize init;
CComPtr<IFolderView> spView;
FindDesktopFolderView(IID_PPV_ARGS(&spView));
CComPtr<IShellFolder> spFolder;
spView->GetFolder(IID_PPV_ARGS(&spFolder));
CComPtr<IEnumIDList> spEnum;
spView->Items(SVGIO_ALLVIEW, IID_PPV_ARGS(&spEnum));
// Iterate through desktop icons
for (CComHeapPtr<ITEMID_CHILD> spidl;
spEnum->Next(1, &spidl, nullptr) == S_OK;
spidl.Free()) {
STRRET str;
spFolder->GetDisplayNameOf(spidl, SHGDN_NORMAL, &str);
CComHeapPtr<wchar_t> spszName;
StrRetToStr(&str, spidl, &spszName);
printf("%ls\n", spszName);
}
return 0;
}