zoukankan      html  css  js  c++  java
  • win32

    网上关于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.
    ";
        }
        catch (std::system_error const& e)
        {
            std::cout << "ERROR: " << e.what() << ", error code: " << e.code() << "
    ";
            return 1;
        }
    
        return 0;
    }

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

  • 相关阅读:
    [LeetCode]Sliding Window Maximum
    判断两根线段是否相交
    求幂,我居然又没做出来
    C++集合运算函数总结 & 需要有序集合的操作
    effective stl读书笔记 & stl里面提供的算法 & emplace & ostream_iterator
    利用位操作的几道题目
    C++的new_handler
    TCP的可靠性 窗口滑动 拥塞控制
    关于高性能网络编程的一些知识
    三种连接 & DOS & SYNFLOOD & 防御
  • 原文地址:https://www.cnblogs.com/strive-sun/p/14068047.html
Copyright © 2011-2022 走看看