"分组" Windows资源管理器中的某个文件夹

时间:2015-04-11 02:45:24

标签: windows explorer

我要做的是为我的应用程序创建一个文件夹,并确保每次用户输入此文件夹时,它都会被分组,如下所示:

folder grouped

除了磁盘将被某些文件夹/文件替换。

所以基本上我正试图实现" Group by"功能确实:

enter image description here

我必须在我的应用程序中使用c / c ++代码或bat。我猜测这需要在注册表中完成,但我无法找到它。任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

您必须明白,使用注册表更改资源管理器视图模式是一种肮脏的黑客攻击。因此自行承担风险。仅在WINDOWS 7上测试。

procedure SetFolderGroupBy(AParentWnd: HWND; const AFolder: UnicodeString; const AColumn: TPropertyKey; AAscending: Boolean);
var
  Desktop: IShellFolder;
  Attr: DWORD;
  Eaten: DWORD;
  IDList: PItemIDList;
  Bag: IPropertyBag;
  Direction: DWORD;
begin
  OleCheck(SHGetDesktopFolder(Desktop));
  try
    Attr := 0;
    OleCheck(Desktop.ParseDisplayName(AParentWnd, nil, PWideChar(AFolder), Eaten, IDList, Attr));
    try
      OleCheck(SHGetViewStatePropertyBag(IDList, 'Shell', SHGVSPB_FOLDERNODEFAULTS, IPropertyBag, Bag));
      try
        OleCheck(Bag.Write('SniffedFolderType', 'Generic'));
      finally
        Bag := nil;
      end;
      OleCheck(SHGetViewStatePropertyBag_(IDList, 'Shell\{5C4F28B5-F869-4E84-8E60-F11DB97C5CC7}', SHGVSPB_FOLDERNODEFAULTS, IPropertyBag, Bag));
      try
        if AAscending then Direction := SORT_ASCENDING
                      else Direction := DWORD(SORT_DESCENDING);
        OleCheck(Bag.Write('GroupByDirection', Direction));
        OleCheck(Bag.Write('GroupByKey:FMTID', GUIDToString(AColumn.fmtid)));
        OleCheck(Bag.Write('GroupByKey:PID', AColumn.pid));
        OleCheck(Bag.Write('GroupView', DWORD(-1)));
      finally
        Bag := nil;
      end;
    finally
      CoTaskMemFree(IDList);
    end;
  finally
    Desktop := nil;
  end;
end;
相关问题