私は自分のアプリケーションでかなり異常な作業をしています。次のコードを使用して、すべての名前空間といくつかのルート名前空間を列挙しています。たとえば、Nethood の作業は非常に遅く、読み込みに 1 分以上かかります (!!)。これは Win7 でのみ発生し、古いシステムでは読み込みは問題ありません。
MustangPeak ライブラリのこの関数を使用しています。
function TNamespace.EnumerateFolder(MessageWnd: HWnd; Folders, NonFolders,
IncludeHidden: Boolean; EnumFunc: TEnumFolderCallback;
UserData: Pointer): integer;
var
Enum: IEnumIDList;
Flags: Longword;
Fetched: Longword;
Item: PItemIDList;
Terminate: Boolean;
OldError: integer;
OldWow64: Pointer;
begin
Result := 0;
OldError := SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);
try
if Assigned(ShellFolder) then
begin
if Assigned(EnumFunc) then
begin
Terminate := False;
Flags := 0;
if Folders then
Flags := Flags or SHCONTF_FOLDERS;
if NonFolders then
Flags := Flags or SHCONTF_NONFOLDERS;
if IncludeHidden then
Flags := Flags or SHCONTF_INCLUDEHIDDEN;
// --- This is new added
Flags := Flags or SHCONTF_ENABLE_ASYNC;
if Valid then
begin
OldWow64 := Wow64RedirectDisable;
try
if ShellFolder.EnumObjects(MessageWnd, Flags, Enum) = NOERROR then
begin
// Vista Enum is nil every once in a while
if Assigned(Enum) then
begin
while (Enum.Next(1, Item, Fetched) = NOERROR) and not Terminate do
begin
if EnumFunc(MessageWnd, Item, Self, UserData, Terminate) then
Inc(Result)
end
end
end
finally
Wow64RedirectRevert(OldWow64)
end
end
end
end
finally
SetErrorMode(OldError);
end
end;
今、私はMSDNのドキュメントを読んで、Win7では結果を即座に取得するために新しい非同期フラグがサポートされていますが、システムがそれを読み取ったときに他の結果を受け取ることができます。
そのフラグは SHCONTF_ENABLE_ASYNC と呼ばれ、コードでマークした場所に追加しました (// --- これは新しく追加されました)
問題は、更新を受信したときにイベントをキャッチする方法がわからないためです。
新しく受け取ったアイテムをフックする方法は? システム(オブジェクト)が何らかのコントロールや構造などに送信するイベント(メッセージなど)はありますか?
ありがとう!