Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: SHChangeNotifyRegister Event

  Alt 12. Mai 2017, 09:13
Ich habe das jetzt mal getestet.
Habe da jedoch noch eine Frage.

Was gibt dir LP aus wenn du eine Datei löschen tust und sie wieder herstellst ?
Das wäre sehr wichtig zu wissen.
Wenn man es richtig macht, kommen folgende Notify-Events:
Code:
00000004 : SHCNE_DELETE
04000000 : SHCNE_EXTENDED_EVENT
04000000 : SHCNE_EXTENDED_EVENT
00008000 : SHCNE_UPDATEIMAGE
00040000 : SHCNE_FREESPACE
04000000 : SHCNE_EXTENDED_EVENT
Du machst es falsch. Der Ansatz mit dem Enum und den Array ist verkehrt.
So hat bei dir ShellStatus.SHCNE_RENAMEITEM den Wert 0 (in Worten Null) und ShellsStatus.SHCNE_FREESPACE den Wert 18.
Das liegt daran, weil hier nicht die Werte der Konstanten aus der ShlObj genommen werden, sondern das Enum selber durchnummeriert.
Dadurch hatten alle ankommenden Events natürlich den Wert 0 mit dabei und deine Lösung zeigte nur SHCNE_RENAMEITEM an.

Mach es bitte so:
Delphi-Quellcode:
type
  TShellStatus = LONG;

function GetShellStatusToString(AShellStatus: TShellStatus): string;
begin
  case AShellStatus of
    SHCNE_RENAMEITEM:
      Result := 'SHCNE_RENAMEITEM'; // 0x00000001L
    SHCNE_CREATE:
      Result := 'SHCNE_CREATE'; // 0x00000002L
    SHCNE_DELETE:
      Result := 'SHCNE_DELETE'; // 0x00000004L
    SHCNE_MKDIR:
      Result := 'SHCNE_MKDIR'; // 0x00000008L
    SHCNE_RMDIR:
      Result := 'SHCNE_RMDIR'; // 0x00000010L
    SHCNE_MEDIAINSERTED:
      Result := 'SHCNE_MEDIAINSERTED'; // 0x00000020L
    SHCNE_MEDIAREMOVED:
      Result := 'SHCNE_MEDIAREMOVED'; // 0x00000040L
    SHCNE_DRIVEREMOVED:
      Result := 'SHCNE_DRIVEREMOVED'; // 0x00000080L
    SHCNE_DRIVEADD:
      Result := 'SHCNE_DRIVEADD'; // 0x00000100L
    SHCNE_NETSHARE:
      Result := 'SHCNE_NETSHARE'; // 0x00000200L
    SHCNE_NETUNSHARE:
      Result := 'SHCNE_NETUNSHARE'; // 0x00000400L
    SHCNE_ATTRIBUTES:
      Result := 'SHCNE_ATTRIBUTES'; // 0x00000800L
    SHCNE_UPDATEDIR:
      Result := 'SHCNE_UPDATEDIR'; // 0x00001000L
    SHCNE_UPDATEITEM:
      Result := 'SHCNE_UPDATEITEM'; // 0x00002000L
    SHCNE_SERVERDISCONNECT:
      Result := 'SHCNE_SERVERDISCONNECT'; // 0x00004000L
    SHCNE_UPDATEIMAGE:
      Result := 'SHCNE_UPDATEIMAGE'; // 0x00008000L
    SHCNE_DRIVEADDGUI:
      Result := 'SHCNE_DRIVEADDGUI'; // 0x00010000L
    SHCNE_RENAMEFOLDER:
      Result := 'SHCNE_RENAMEFOLDER'; // 0x00020000L
    SHCNE_FREESPACE:
      Result := 'SHCNE_FREESPACE'; // 0x00040000L
    SHCNE_EXTENDED_EVENT:
      Result := 'SHCNE_EXTENDED_EVENT';
    SHCNE_EXTENDED_EVENT_PRE_IE4:
      Result := 'SHCNE_EXTENDED_EVENT_PRE_IE4';
    SHCNE_ASSOCCHANGED:
      Result := 'SHCNE_ASSOCCHANGED';
    SHCNE_DISKEVENTS:
      Result := 'SHCNE_DISKEVENTS';
    SHCNE_GLOBALEVENTS:
      Result := 'SHCNE_GLOBALEVENTS';
    SHCNE_ALLEVENTS:
      Result := 'SHCNE_ALLEVENTS';
  else
    Result := 'Something completly different!';
  end;
end;

procedure TForm1.WMShellNotify(var Message: TMessage);
var
  Status: TShellStatus;
  DebugText: string;
begin
  DebugText := GetShellStatusToString(TShellStatus(Message.LParam));
  DebugText := IntToHex(Message.LParam, 8) + ' : ' + DebugText;
  OutputDebugString(PChar(DebugText));
end;
  Mit Zitat antworten Zitat