You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:45:08