win32 – IFolderView2::GetCurrentFolderFlags的使用

网上关于IFolderView2接口调用的示例有点少。 

下面的例子是将桌面的图标隐藏起来,使用了FWF_NOICONS样式。

#include <ShlObj.h>     // Shell API
#include <atlcomcli.h>  // CComPtr & Co.
#include <string> 
#include <iostream> 
#include <system_error>
#include <vector>
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)

// Throw a std::system_error if the HRESULT indicates failure.
template< typename T >
void ThrowIfFailed(HRESULT hr, T&& msg)
{
    if (FAILED(hr))
        throw std::system_error{ hr, std::system_category(), std::forward<T>(msg) };
}

// RAII wrapper to initialize/uninitialize COM
struct CComInit
{
    CComInit() { ThrowIfFailed(::CoInitialize(nullptr), "CoInitialize failed"); }
    ~CComInit() { ::CoUninitialize(); }
    CComInit(CComInit const&) = delete;
    CComInit& operator=(CComInit const&) = delete;
};

// Query an interface from the desktop shell view.
void FindDesktopFolderView(REFIID riid, void** ppv, std::string const& interfaceName)
{
    CComPtr<IShellWindows> spShellWindows;
    ThrowIfFailed(
        spShellWindows.CoCreateInstance(CLSID_ShellWindows),
        "Failed to create IShellWindows instance");

    CComVariant vtLoc(CSIDL_DESKTOP);
    CComVariant vtEmpty;
    long lhwnd;
    CComPtr<IDispatch> spdisp;
    ThrowIfFailed(
        spShellWindows->FindWindowSW(
            &vtLoc, &vtEmpty, SWC_DESKTOP, &lhwnd, SWFO_NEEDDISPATCH, &spdisp),
        "Failed to find desktop window");

    CComQIPtr<IServiceProvider> spProv(spdisp);
    if (!spProv)
        ThrowIfFailed(E_NOINTERFACE, "Failed to get IServiceProvider interface for desktop");

    CComPtr<IShellBrowser> spBrowser;
    ThrowIfFailed(
        spProv->QueryService(SID_STopLevelBrowser, IID_PPV_ARGS(&spBrowser)),
        "Failed to get IShellBrowser for desktop");

    CComPtr<IShellView> spView;
    ThrowIfFailed(
        spBrowser->QueryActiveShellView(&spView),
        "Failed to query IShellView for desktop");

    ThrowIfFailed(
        spView->QueryInterface(riid, ppv),
        "Could not query desktop IShellView for interface " + interfaceName);
}


void ToggleDesktopIcons()
{
    CComPtr<IFolderView2> spView;
    FindDesktopFolderView(IID_PPV_ARGS(&spView), "IFolderView2");

    DWORD flags = 0;
    ThrowIfFailed(
        spView->GetCurrentFolderFlags(&flags),
        "GetCurrentFolderFlags failed");
    ThrowIfFailed(
        spView->SetCurrentFolderFlags(FWF_NOICONS, flags ^FWF_NOICONS),
        "SetCurrentFolderFlags failed");


}



int wmain(int argc, wchar_t** argv)
{
    try
    {
        CComInit init;

        ToggleDesktopIcons();

        std::cout << "Desktop icons have been toggled.\n";
    }
    catch (std::system_error const& e)
    {
        std::cout << "ERROR: " << e.what() << ", error code: " << e.code() << "\n";
        return 1;
    }

    return 0;
}

另外,我在寻找IFolderView2::GetSortColumns的使用实例,如果有人碰巧做过这样的案例,可以在评论区中告诉我。

原文链接: https://www.cnblogs.com/strive-sun/p/14068047.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    win32 - IFolderView2::GetCurrentFolderFlags的使用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404786

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:43
下一篇 2023年4月25日 下午4:43

相关推荐