AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi SHChangeNotifyRegister Event
Thema durchsuchen
Ansicht
Themen-Optionen

SHChangeNotifyRegister Event

Ein Thema von EWeiss · begonnen am 10. Mai 2017 · letzter Beitrag vom 12. Mai 2017
Antwort Antwort
Seite 2 von 2     12   
EWeiss
(Gast)

n/a Beiträge
 
#11

AW: SHChangeNotifyRegister Event

  Alt 11. Mai 2017, 10:13
Danke dir Tigü
Werde es mir nachher mal ansehen bzw. implementieren.
Muss jetzt erst mal in die Kiste

Sage dann bescheid ob es läuft.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: SHChangeNotifyRegister Event

  Alt 11. Mai 2017, 18:45
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.

Kann es sein das dort gar nichts sinnvolles bei rum kommt?
Denn bei mir ist es immer SHCNE_RENAMEITEM! was hat das mit dem löschen von Dateien zu tun?
Delphi-Quellcode:
Type
  ShellStatus =(
    SHCNE_RENAMEITEM,
    SHCNE_CREATE,
    SHCNE_DELETE,
    SHCNE_MKDIR,
    SHCNE_RMDIR,
    SHCNE_MEDIAINSERTED,
    SHCNE_MEDIAREMOVED,
    SHCNE_DRIVEREMOVED,
    SHCNE_DRIVEADD,
    SHCNE_NETSHARE,
    SHCNE_NETUNSHARE,
    SHCNE_ATTRIBUTES,
    SHCNE_UPDATEDIR,
    SHCNE_UPDATEITEM,
    SHCNE_SERVERDISCONNECT,
    SHCNE_UPDATEIMAGE,
    SHCNE_DRIVEADDGUI,
    SHCNE_RENAMEFOLDER,
    SHCNE_FREESPACE
  );
  TShellStatus = ShellStatus;
Delphi-Quellcode:
const
  cShellStatus : Array[TShellStatus] of String =(
    'SHCNE_RENAMEITEM', // 0x00000001L
    'SHCNE_CREATE', // 0x00000002L
    'SHCNE_DELETE', // 0x00000004L
    'SHCNE_MKDIR', // 0x00000008L
    'SHCNE_RMDIR', // 0x00000010L
    'SHCNE_MEDIAINSERTED', // 0x00000020L
    'SHCNE_MEDIAREMOVED', // 0x00000040L
    'SHCNE_DRIVEREMOVED', // 0x00000080L
    'SHCNE_DRIVEADD', // 0x00000100L
    'SHCNE_NETSHARE', // 0x00000200L
    'SHCNE_NETUNSHARE', // 0x00000400L
    'SHCNE_ATTRIBUTES', // 0x00000800L
    'SHCNE_UPDATEDIR', // 0x00001000L
    'SHCNE_UPDATEITEM', // 0x00002000L
    'SHCNE_SERVERDISCONNECT', // 0x00004000L
    'SHCNE_UPDATEIMAGE', // 0x00008000L
    'SHCNE_DRIVEADDGUI', // 0x00010000L
    'SHCNE_RENAMEFOLDER', // 0x00020000L
    'SHCNE_FREESPACE'         // 0x00040000L
  );
Delphi-Quellcode:
procedure RegisterRecyleBin(WinHandle: HWND);
var
  hNotifyRBin: ULONG;
   pidlRecycleBin: PItemIDList;
  stPIDL: TSHChangeNotifyEntry;
  hr: HRESULT;
begin

  hr := SHGetSpecialFolderLocation(WinHandle, CSIDL_BITBUCKET, pidlRecycleBin);
  if Succeeded(hr) then
  begin
    stPIDL.pidl := pidlRecycleBin;
    stPIDL.fRecursive := True;

    hNotifyRBin := SHChangeNotifyRegister(WinHandle, SHCNF_ACCEPT_INTERRUPTS or
      SHCNF_ACCEPT_NON_INTERRUPTS, SHCNE_ALLEVENTS, WM_SHELLNOTIFY, 1, stPIDL);

    if 0 = hNotifyRBin then
      RaiseLastOSError(GetLastError);
  end
  else
    RaiseLastOSError;
end;
Delphi-Quellcode:
var
  Status : ShellStatus;
Delphi-Quellcode:
    WM_SHELLNOTIFY:
      begin
        Status := ShellStatus(lP);
        ShowMessage(cShellStatus[Status]);
      end;


gruss

Geändert von EWeiss (11. Mai 2017 um 20:10 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: SHChangeNotifyRegister Event

  Alt 12. Mai 2017, 10: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
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: SHChangeNotifyRegister Event

  Alt 12. Mai 2017, 10:17
Zitat:
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.
Ahh OK
so lernt man dazu.

Aber ein versuch war es wert.... LOL
Zumindest ist mein Papierkorb leer/Voll und ich kann es sehn.
Im Moment scheint er leer zu sein.

PS:
Bei mir kommen nur die beiden

00008000 : SHCNE_UPDATEIMAGE
00040000 : SHCNE_FREESPACE

Na gut war eh nur ein Test das mit dem Debugstring muss ich nicht haben.
Das andere funktioniert gut..

gruss

Geändert von EWeiss (11. Jul 2019 um 16:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz