如何获取桌面上图标的名称

问题描述 投票:0回答:2

伙计们。 我想用c++获取桌面上的图标名称。我知道如何获取他们的句柄:

HWND hwnd = FindWindow("Progman","Program Manager");
  HWND  hwndSHELLDLL_DefView = ::FindWindowEx( hwnd, NULL, "SHELLDLL_DefView", NULL ); 
  HWND  hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );

下一步是什么?

c++ windows winapi
2个回答
5
投票

首先,您需要使用 SHGetFolderLocation 获取桌面文件夹的位置。接下来,您使用 IShellFolder::EnumObjects

枚举此文件夹的内容

从这里开始,天空才是极限。有关与 Windows shell 交互的大量信息此处

玩得开心!

更新:

快速谷歌搜索会出现这个示例,它似乎完全符合您的要求。


0
投票

以下代码将桌面上每个图标的名称打印到控制台。代码很大程度上基于 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.