IShellFolderView的AddObject与RemoveObject方法替代实现方案咨询
解决方案
一、SHShellFolderView_Message正确句柄获取方式
SHShellFolderView_Message的第一个参数要求传入Shell文件夹视图本身的窗口句柄,而非资源管理器顶层的cabinet窗口句柄,获取步骤如下:
- 从你已有的
IShellView接口指针调用GetWindow方法直接获取视图窗口句柄:
HWND hShellViewWnd = nullptr; HRESULT hr = pShellView->GetWindow(&hShellViewWnd); if (SUCCEEDED(hr)) { // 传入获取到的hShellViewWnd调用即可,第四个参数保留填0 SHShellFolderView_Message(hShellViewWnd, SFVM_REMOVEOBJECT, (LPARAM)pidl, 0); }
额外注意:如果调用后仍无效果,需校验传入的pidl是否为当前视图对应文件夹的子级相对pidl,传入桌面级绝对pidl会导致操作不生效。
二、更稳定的官方推荐替代方案
Win7及以上系统官方推荐使用IFolderView2接口替代已废弃的IShellFolderView,该接口原生支持对象增删、可见性控制能力,兼容性和稳定性远高于发送窗口消息,无需处理窗口句柄相关逻辑。
调用示例
// 从现有IShellView查询IFolderView2接口 CComPtr<IFolderView2> pFolderView2; HRESULT hr = pShellView->QueryInterface(IID_IFolderView2, (LPVOID*)&pFolderView2); if (SUCCEEDED(hr)) { // 移除指定对象 hr = pFolderView2->RemoveItem(0, pidl); // 新增指定对象 // hr = pFolderView2->AddItem(pidl, 0, nullptr); // 隐藏指定对象 // hr = pFolderView2->SetItemVisibility(pidl, FALSE); // 显示指定对象 // hr = pFolderView2->SetItemVisibility(pidl, TRUE); }
你正在调整的StExBar项目原有依赖IShellFolderView的逻辑,可以直接用上述IFolderView2的对应方法完成替换,无需修改原有业务逻辑流程。
内容的提问来源于stack exchange,提问作者Reznicencu Bogdan
相关产品推荐
相关产品推荐

