Nur nochmal zur Vervollständigung.
Ich registriere den Papierkorb damit das Event WM_SHELLNOTIFY ausgelöst wird.
Delphi-Quellcode:
{$REGION 'procedure RegisterRecyleBin'}
procedure TMainApp.RegisterRecyleBin(WinHandle: HWND);
var
pidlRecycleBin: PItemIDList;
stPIDL: TSHChangeNotifyEntry;
hr: HRESULT;
begin
hr := SHGetSpecialFolderLocation(WinHandle, CSIDL_BITBUCKET, pidlRecycleBin);
if Succeeded(hr) then
begin
stPIDL.pidl := pidlRecycleBin;
stPIDL.fRecursive := True;
FHNotifyRBin := SHChangeNotifyRegister(WinHandle,
SHCNF_ACCEPT_INTERRUPTS or SHCNF_ACCEPT_NON_INTERRUPTS, SHCNE_ALLEVENTS, WM_SHELLNOTIFY, 1,
stPIDL);
if 0 = FHNotifyRBin then
RaiseLastOSError(GetLastError);
end
else
RaiseLastOSError;
// Hier werde ich nun den Hook implementieren und die Anwendung entsprechend des Event neu starten.
end;
{$ENDREGION}
Wenn nun der Explorer abstürzt wird das Event WM_SHELLNOTIFY nicht mehr ausgelöst da es zum vorherigen Prozess Explorer.exe nicht mehr gültig ist.
Bzw. Der Papierkorb ist dann nicht mehr registriert (FHNotifyRBin = Registrations ID) ist dann ungültig.
Wie gesagt es ist mir unverständlich das ein System so unzuverlässig ist und man selber eventuelle Fehler diesbezüglich abfangen muss.