网上关于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大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404786
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!