Msgbox bei ini veränderung ausgeben

  • Moin Moin,
    Ich bin grade dabei in Skript zur überwachung von Verzeichnissen zu schreiben und habe die Idee, das wenn meine Ini geändert wird, eine msgbox aufploppt und mir sagt was passiert bzw was neu ist.
    Eventuell steh ich einfach nur auf dem schlauch grade weil ich schon seit'n paar Stunden zugange bin oder ich bin einfach nur blöd ^^

    Spoiler anzeigen
    [autoit]

    ;===========Die Funktionen==========;

    [/autoit] [autoit][/autoit] [autoit]

    Func _searchFiles()
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    ;_ArrayDisplay($Files_a,"Dateien für die ini")
    _ArrayToClip($Files_a)
    For $i = 1 to $Files_a[0]
    $Pfad_s = IniRead("C:\AutoIT\Test.ini","Allgemein","Dateien","")
    If @error or not FileExists("C:\AutoIT\Test.ini") then
    IniWrite("C:\AutoIT\Test.ini","Allgemein","Dateien",ClipGet())
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=========Die .ini erneuern========;
    Local $Files_a

    [/autoit] [autoit][/autoit] [autoit]

    Func _refreshIni()
    ;IF FileFindNextFile("*.*") Then
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    _ArrayToClip($Files_a)
    IniWrite("C:\AutoIt\Test.ini","Allgemein","Dateien",ClipGet())
    For $a = 1 to $Files_a[0]
    Next
    EndIf
    ;EndIf
    EndFunc

    [/autoit]

    Mir ist klar das das mit dem array to clip gedröse noch schlecht gelößt is, ist mir aber grade zuviel aufwand alles umzutippen :thumbup:
    naja vllt habt ihr ja ne Idee wo man da noch ne Msgbox einbauen kann die nicht instand aufploppt bei jeden "refresh" des Ordners durch das skript, sondern nur beim erneuten Eintragen in die Ini

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

    Einmal editiert, zuletzt von Darnas (8. Januar 2015 um 16:53)

  • Wenn du vor dem Schreiben in die Inifile überprüfst, ob du überhaupt etwas in die schreiben musst(IniRead mit dem Write-wert vergleichen), kommt man relative schnell auf die Lösung. Hab's mal nicht getestet, aber so in etwa sollte es klappen (hab das ClipGet mal als String genommen).

    [autoit]

    ;=========Die .ini erneuern========;
    Func _refreshIni()
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    $ClipGet = _ArrayToString($Files_a)
    If IniRead("C:\AutoIt\Test.ini","Allgemein","Dateien","not found") <> $ClipGet Then
    IniWrite("C:\AutoIt\Test.ini","Allgemein","Dateien",$ClipGet)
    MsgBox($MB_ICONINFORMATION,"Info!","Ini file wurde verändert")
    EndIf
    For $a = 1 to $Files_a[0]
    Next
    EndIf
    EndFunc

    [/autoit]


    Für was die Forschleife gut sein soll, habe ich mich auch noch gefragt.

  • Danke,
    ich bekomme zwar die msgbox das etwas verändert wurde in dem Verzeichnis, aber ich möchte ja wissen was genau passiert, dh, z.B. "ein(e) Ordner/Datei ist dazu gekommen" "ein(e) Ordner/Datei wurde entfernt"

    kann ich das mit einer normalen msgbox realisieren oder müsste man extra ein GUI machen?

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

  • Eine extra GUI bräuchtest du dazu nicht. Du hast doch schon den richtigen Ansatz mit

    [autoit]

    _FileListToArray($Path_s,"*",1)

    [/autoit]


    Die 1 kannst du ja variabel halten (1 = Nur Dateien ; 2 = Nur Ordner) und je nachdem ausgeben.
    Die _refreshIni könnte dann so aussehen:

    [autoit]

    ;=========Die .ini erneuern========;
    Func _refreshIni($iFlag)
    If $iFlag = 1 OR $iFlag = 0 Then
    $Files_a = _FileListToArray($Path_s,"*",$iFlag)
    If IsArray($Files_a) Then
    $ClipGet = _ArrayToString($Files_a)
    If IniRead("C:\AutoIt\Test.ini","Allgemein","Dateien","not found") <> $ClipGet Then
    IniWrite("C:\AutoIt\Test.ini","Allgemein","Dateien",$ClipGet)
    If $iFlag = 1 Then
    MsgBox($MB_ICONINFORMATION,"Info!","Datei wurde hinzugefügt")
    Else
    MsgBox($MB_ICONINFORMATION,"Info!","Ordner wurde hinzugefügt")
    EndIf
    EndIf
    Else
    MsgBox($MB_ICONERROR,"Error!","_refreshIni mit falschem Parameter aufgerufen (0 oder 1)!")
    EndIf
    EndFunc

    [/autoit]


    (auch wieder nicht getestet)

    Die MsgBox erscheint aber bei jeder(!) neuen Datei. Evtl. musst du die Funktion um ein Flag/Returnvalue erweitern, der auf Änderung überprüft und nachdem alles verändert wurde angibt, dass sich etwas verändert hat.
    Und wegen dem entfernen einfach dich in die IniDelete einlesen (geht analog zu IniWrite).

  • So wie du das Skript da verbessert hast, funktioniert es nicht.
    Davon abgsehen das du einmal "endif" vergessen hast geht es trd nicht :D
    Von Außen sieht es gut aus, ich weiß auch nicht wirklich woran es liegen könnte, hat aber was mit variable $flag zu tun denke ich, da sie ja erst später definiert wird.
    Die Console sagt: "_refreshini() ^Error
    Also bin ich wohl richtig mit meiner Vermutung?
    und die Variable $MB_ICONERROR wird auch ganicht deklariert? :D
    naja das skript läuft leider nicht zu dem zeitpunkt, falls du noch ne idee hast zum thema getclip und array to clip - wenn das skript läuft kann man nichts mehr kopieren, da die zwischenablage im sekundentakt mit dem Array gefüllt wird - sag es mir :D ich hätte an eine Temp datei gedacht die als zwischenablage fungiert :D

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

  • Spoiler anzeigen
    [autoit]


    #include <MsgBoxConstants.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _refreshIni(1)
    _refreshIni(0)

    [/autoit] [autoit][/autoit] [autoit]

    ;=========Die .ini erneuern========;
    Func _refreshIni($iFlag)
    If $iFlag = 1 OR $iFlag = 0 Then
    $Files_a = _FileListToArray($Path_s,"*",$iFlag)
    If IsArray($Files_a) Then
    $ClipGet = _ArrayToString($Files_a)
    If IniRead("C:\AutoIt\Test.ini","Allgemein","Dateien","not found") <> $ClipGet Then
    IniWrite("C:\AutoIt\Test.ini","Allgemein","Dateien",$ClipGet)
    If $iFlag = 1 Then
    MsgBox($MB_ICONINFORMATION,"Info!","Datei wurde hinzugefügt")
    Else
    MsgBox($MB_ICONINFORMATION,"Info!","Ordner wurde hinzugefügt")
    EndIf
    EndIf
    EndIf
    Else
    MsgBox($MB_ICONERROR,"Error!","_refreshIni mit falschem Parameter aufgerufen (0 oder 1)!")
    EndIf
    EndFunc

    [/autoit]


    Und wo genau klappt da was nicht?

    Einmal editiert, zuletzt von draien (12. Januar 2015 um 14:02)

  • Bei dem Skript passiert jetzt nichts mehr außer das, das skript startet sich beide msgboxen nach einnander öffnen und dannach das skript beendet wird. - exit code 1 Time: 3.212
    _refreshini()
    ^ERROR, hier klappt das nicht

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

  • $Path_ini muss noch geändert warden und die Sections [Dateien] und [Ordner] in die Ini hinzugefügt werden.

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #Include <array.au3>
    #include <MsgBoxConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("+!d", "_CloseIt") ;mit ESC kann Skript verlassen werden

    [/autoit] [autoit][/autoit] [autoit]

    Func _CloseIt()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;============Variablen============;
    Global $Files_a ;$Path_s = InputBox("Pfad angegeben:","Gib den Pfad für den Ordner/Verzeichnis an","C:\AutoIt")
    GLobal $Path_s = @ScriptDir
    Global $Path_ini = @ScriptDir & "\Test.ini" ;Hier inipfad angeben!

    [/autoit] [autoit][/autoit] [autoit]

    _refreshIni("Dateien")
    _refreshIni("Ordner")

    [/autoit] [autoit][/autoit] [autoit]

    Func _refreshIni($section)
    Local $added

    [/autoit] [autoit][/autoit] [autoit]

    Switch $section
    Case "Dateien"
    $Files_a = _FileListToArray($Path_s,"*",1)
    For $x = 1 To $Files_a[0]
    If IniRead($Path_ini,$section,$Files_a[$x],"not found") <> "Datei" Then
    IniWrite($Path_ini,$section,$Files_a[$x],"Datei")
    $added = "Datei(en)"
    EndIf
    Next
    Case "Ordner"
    $Files_a = _FileListToArray($Path_s,"*",2)
    For $x = 1 To $Files_a[0]
    If IniRead($Path_ini,$section,$Files_a[$x],"not found") <> "Ordner" Then
    IniWrite($Path_ini,$section,$Files_a[$x],"Ordner")
    $added = "Ordner"
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Case Else
    MsgBox($MB_ICONERROR,"Error!",'_refreshIni mit falschem Parameter aufgerufen ("Dateien" oder "Ordner")!')
    $added = ""
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    If $added Then
    MsgBox($MB_ICONINFORMATION,"Info!","Ein oder mehrere " & $added & " wurde(n) hinzugefügt")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc
    ;===========Die Funktionen==========;

    [/autoit] [autoit][/autoit] [autoit]

    Func _searchFiles()
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    ;_ArrayDisplay($Files_a,"Dateien für die ini")
    _ArrayToClip($Files_a)
    For $i = 1 to $Files_a[0]
    $Pfad_s = IniRead("$Path_s&Test.ini","Allgemein","Dateien","")
    If @error or not FileExists("$Path_s&Test.ini") then
    IniWrite("$Path_s&Test.ini","Allgemein","Dateien",ClipGet())
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit]
  • jetzt spuckt er diesen Fehler aus:
    For $x = 1 To $Files_a[0]
    For $x = 1 To $Files_a^ ERROR
    >Exit code: 1 Time: 2.161

    Ich Finde mich in mienen eigenen Skript kaum noch zurecht :D
    ########und hab mein Original auch noch verloren :o schei** autosafe##############
    Habs wiedergefunden in den kommentaren, ich schick mal mehr rein ^^


    so wie es jetzt ist, kommt eine meldung das die ini datei beschrieben wurden - ohne die infos die ich haben will:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #Include <array.au3>
    #include <MsgBoxConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("+!d", "_CloseIt") ;mit ESC kann Skript verlassen werden

    [/autoit] [autoit][/autoit] [autoit]

    Func _CloseIt()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;============Variablen============;
    Global $Files_a ;$Path_s = InputBox("Pfad angegeben:","Gib den Pfad für den Ordner/Verzeichnis an","C:\AutoIt")
    GLobal $Path_s = "C:\users\mschulz\desktop\Scripte\"
    ;_refreshIni(1)
    ;_refreshIni(0)

    [/autoit] [autoit][/autoit] [autoit]

    ;===========Die Funktionen==========;

    [/autoit] [autoit][/autoit] [autoit]

    Func _searchFiles()
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    ;_ArrayDisplay($Files_a,"Dateien für die ini")
    _ArrayToClip($Files_a)
    For $i = 1 to $Files_a[0]
    $Pfad_s = IniRead("$Path_s&Test.ini","Allgemein","Dateien","")
    If @error or not FileExists("$Path_s&Test.ini") then
    IniWrite("$Path_s&Test.ini","Allgemein","Dateien",ClipGet())
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    #cs ;=========Die .ini erneuern========;
    Func _refreshIni($iFlag)
    If $iFlag = 1 OR $iFlag = 0 Then
    $Files_a = _FileListToArray($Path_s,"*",$iFlag)
    If IsArray($Files_a) Then
    $ClipGet = _ArrayToString($Files_a)
    If IniRead("C:\AutoIt\Test.ini","Allgemein","Dateien","not found") <> $ClipGet Then
    IniWrite("C:\AutoIt\Test.ini","Allgemein","Dateien",$ClipGet)
    If $iFlag = 1 Then
    MsgBox($MB_ICONINFORMATION,"Info!","Datei wurde hinzugefügt")
    Else
    MsgBox($MB_ICONINFORMATION,"Info!","Ordner wurde hinzugefügt")
    EndIf
    EndIf
    EndIf
    Else
    MsgBox($MB_ICONERROR,"Error!","_refreshIni mit falschem Parameter aufgerufen (0 oder 1)!")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    #ce

    [/autoit] [autoit][/autoit] [autoit]

    ;=========Die .ini erneuern========;
    Func _refreshIni()
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    $ClipGet = _ArrayToString($Files_a)
    If IniRead("$Path_s&Test.ini","Allgemein","Dateien","not found") <> $ClipGet Then
    IniWrite("$Path_s&Test.ini","Allgemein","Dateien",$ClipGet)
    MsgBox($MB_ICONINFORMATION,"Info!","Ini file wurde verändert")
    EndIf
    For $a = 1 to $Files_a[0]
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    _searchFiles()
    sleep(1000)
    _refreshIni()
    Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;==========Programm in die Registry reinschrieben, damit es beim Autostart startet===============;
    #cs
    Func _Regwrite()

    [/autoit] [autoit][/autoit] [autoit]

    RegWrite("HKEY_CURRENT_USER\Software\Test", "TestKEY", "REG_SZ", "TESTTEST")
    RegDelete("HKEY_CURRENT_USER\Software\Test")

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    #include <MsgBoxConstants.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _refreshIni(1)
    _refreshIni(0)

    [/autoit] [autoit][/autoit] [autoit]

    ;=========Die .ini erneuern========;
    Func _refreshIni($iFlag)
    If $iFlag = 1 OR $iFlag = 0 Then
    $Files_a = _FileListToArray($Path_s,"*",$iFlag)
    If IsArray($Files_a) Then
    $ClipGet = _ArrayToString($Files_a)
    If IniRead("C:\AutoIt\Test.ini","Allgemein","Dateien","not found") <> $ClipGet Then
    IniWrite("C:\AutoIt\Test.ini","Allgemein","Dateien",$ClipGet)
    If $iFlag = 1 Then
    MsgBox($MB_ICONINFORMATION,"Info!","Datei wurde hinzugefügt")
    Else
    MsgBox($MB_ICONINFORMATION,"Info!","Ordner wurde hinzugefügt")
    EndIf
    EndIf
    EndIf
    Else
    MsgBox($MB_ICONERROR,"Error!","_refreshIni mit falschem Parameter aufgerufen (0 oder 1)!")
    EndIf
    EndFunc
    #ce

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    nicht wundern hab relativ viele notitzen, muss das gleich nochmal sortieren - sieht unübersichtlich aus

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

    Einmal editiert, zuletzt von Darnas (12. Januar 2015 um 14:16)

  • jetzt spuckt er diesen Fehler aus:
    For $x = 1 To $Files_a[0]
    For $x = 1 To $Files_a^ ERROR
    >Exit code: 1 Time: 2.161

    änder mal

    [autoit]


    GLobal $Path_s = @ScriptDir

    [/autoit]


    zu deinem richtigen Path_s. Und benutze das hier:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #Include <array.au3>
    #include <MsgBoxConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("+!d", "_CloseIt") ;mit ESC kann Skript verlassen werden

    [/autoit] [autoit][/autoit] [autoit]

    Func _CloseIt()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;============Variablen============;
    Global $Files_a ;$Path_s = InputBox("Pfad angegeben:","Gib den Pfad für den Ordner/Verzeichnis an","C:\AutoIt")
    GLobal $Path_s = @ScriptDir
    Global $Path_ini = @ScriptDir & "\Test.ini" ;Hier inipfad angeben!

    [/autoit] [autoit][/autoit] [autoit]

    _refreshIni("Dateien")
    _refreshIni("Ordner")

    [/autoit] [autoit][/autoit] [autoit]

    Func _refreshIni($section)
    Local $added

    [/autoit] [autoit][/autoit] [autoit]

    Switch $section
    Case "Dateien"
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    For $x = 1 To $Files_a[0]
    If IniRead($Path_ini,$section,$Files_a[$x],"not found") <> "Datei" Then
    IniWrite($Path_ini,$section,$Files_a[$x],"Datei")
    $added = "Datei(en)"
    EndIf
    Next
    EndIf
    Case "Ordner"
    $Files_a = _FileListToArray($Path_s,"*",2)
    If IsArray($Files_a) Then
    For $x = 1 To $Files_a[0]
    If IniRead($Path_ini,$section,$Files_a[$x],"not found") <> "Ordner" Then
    IniWrite($Path_ini,$section,$Files_a[$x],"Ordner")
    $added = "Ordner"
    EndIf
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case Else
    MsgBox($MB_ICONERROR,"Error!",'_refreshIni mit falschem Parameter aufgerufen ("Dateien" oder "Ordner")!')
    $added = ""
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    If $added Then
    MsgBox($MB_ICONINFORMATION,"Info!","Ein oder mehrere " & $added & " wurde(n) hinzugefügt")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc
    ;===========Die Funktionen==========;

    [/autoit] [autoit][/autoit] [autoit]

    Func _searchFiles()
    $Files_a = _FileListToArray($Path_s,"*",1)
    If IsArray($Files_a) Then
    ;_ArrayDisplay($Files_a,"Dateien für die ini")
    _ArrayToClip($Files_a)
    For $i = 1 to $Files_a[0]
    $Pfad_s = IniRead("$Path_s&Test.ini","Allgemein","Dateien","")
    If @error or not FileExists("$Path_s&Test.ini") then
    IniWrite("$Path_s&Test.ini","Allgemein","Dateien",ClipGet())
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit]

    Und deine Ini sollte so aussehen:

    Spoiler anzeigen
    Code
    [Dateien]
    [Ordner]

    So und wenn du jetzt noch was aus der Ini löschen willst, musst du das ganze umgekehrt machen (IniRead -> Array ; Array mit FileList vergleichen und IniDelete anwenden)
    Hab versucht eher Hilfe zu leisten, als einen vorgekauten Brei vorzusetzen :/
    Aber das war's von meiner Seite.
    Sonst artet das hier noch aus.

  • Danke Danke, jetzt sieht das Skript zwar schöen und aus
    aaaaaaaber, ich wollte ja wissen was genau dazugekommen ist oder gegenagen ist, also wie der Datei oder Ordnername ist :D
    Falls es dir reicht kann ichs verstehen dann bekomme ich das schon irgendwie selbst hin :D
    aber trd danke danke :)

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

  • Mein Kopf Qualmt schon wieder :rofl:
    Der syntax sieht zwar garnicht so kompliziert aus, aber ich mach erstmal ne pause zum thema "ini auslesen"
    ich geh für den rest des tages ran, das sich das skript in die regestry schreibt und dannach beim autostart geht :D
    Morgen gehts dann wieder an die ini :D
    trd danke :)

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

  • Darnas:
    Wenn du alle geänderten Dateien in einer Messagebox ausgeben willst, dann die Zeile 29 und 39 ersetzen mit:

    Spoiler anzeigen
    [autoit]


    $added &= $Files_a[$x]

    [/autoit]


    Und die letzte Messagebox zu (Zeile 42):

    [autoit]


    MsgBox($MB_ICONINFORMATION,"Info!","Folgende Datei(en)/Ordner wurde(n) hinzugefügt: " & @CRLF & $added)

    [/autoit]


    Wenn du jedesmal eine neue MessageBox für alle Dateien haben möchtest, dann Zeile 29 und 39 ersetzen mit:

    Spoiler anzeigen
    [autoit]

    MsgBox($MB_ICONINFORMATION,"Info!","Folgender Ordner wurde hinzugefügt: " & @CRLF & $Files_a[$x])

    [/autoit]

    Oscar :
    Daran hab ich gar nicht gedacht :O

  • Danke,
    mir ist grade aufgefallen das er zwar merkt, dass es eine neue Datei oder Ordner Gibt - das unterscheidet er auch, ich will aber auch eine meldung bekommen falls eine gelöscht wird, bzw immerhin sollte es in der Ini stehen damit weiß was passiert ist :D

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.

    • Offizieller Beitrag

    Hier ist mal ein Beispielscript zu "_WinAPI_ShellChangeNotifyRegister":

    Spoiler anzeigen
    [autoit]


    #include <APIShellExConstants.au3>
    #include <Date.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPI.au3>
    #include <WinAPIShellEx.au3>
    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('TrayAutoPause', 0)
    OnAutoItExitRegister('OnAutoItExit')

    [/autoit] [autoit][/autoit] [autoit]

    Global $sPath = 'c:\temp' ; <- das zu überwachene Verzeichnis (inkl. Unterverzeichnisse)
    Global $sInput
    Global $SOURCES = BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate('Verzeichnis-Überwachung', 800, 480)
    GUISetFont(12, 400, 0, 'Arial', $hGui, 5)
    GUICtrlCreateLabel('Verzeichnis:', 10, 23, 85, 28)
    Global $idPath = GUICtrlCreateInput($sPath, 100, 20, 494, 24)
    Global $idSelectPath = GUICtrlCreateButton('...', 600, 19, 30, 25)
    Global $idChangeLV = GUICtrlCreateListView('Uhrzeit|Änderung|Datei / Verzeichnis', 10, 70, 780, 400)
    _GUICtrlListView_SetColumnWidth($idChangeLV, 0, 160)
    _GUICtrlListView_SetColumnWidth($idChangeLV, 1, 190)
    _GUICtrlListView_SetColumnWidth($idChangeLV, 2, 380)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
    GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
    Global $iID = _WinAPI_ShellChangeNotifyRegister($hGui, $iMsg, $SHCNE_ALLEVENTS, $SOURCES, $sPath, 1)
    If @error Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', 'Window does not registered.')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGui)
    WinSetOnTop($hGui, '', 1)
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idSelectPath
    $sInput = FileSelectFolder('Bitte das Verzeichnis auswählen...', $sPath, 1, '', $hGui)
    If FileExists($sInput) Then
    $sPath = $sInput
    GUICtrlSetData($idPath, $sPath)
    If $iID Then _WinAPI_ShellChangeNotifyDeregister($iID)
    $iID = _WinAPI_ShellChangeNotifyRegister($hGui, $iMsg, $SHCNE_ALLEVENTS, $SOURCES, $sPath, 1)
    EndIf
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit()
    If $iID Then _WinAPI_ShellChangeNotifyDeregister($iID)
    EndFunc ;==>OnAutoItExit

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg
    Local $sPath = _WinAPI_ShellGetPathFromIDList(DllStructGetData(DllStructCreate('dword Item1; dword Item2', $wParam), 'Item1'))
    Local $sNew = _WinAPI_ShellGetPathFromIDList(DllStructGetData(DllStructCreate('dword Item1; dword Item2', $wParam), 'Item2'))
    ConsoleWrite($sNew & @CR)
    If $sPath Then
    Switch $lParam
    Case $SHCNE_MKDIR
    GUICtrlCreateListViewItem(_Now() & '|Verzeichnis erstellt|' & $sPath, $idChangeLV)
    Case $SHCNE_RMDIR
    GUICtrlCreateListViewItem(_Now() & '|Verzeichnis gelöscht|' & $sPath, $idChangeLV)
    Case $SHCNE_RENAMEFOLDER
    GUICtrlCreateListViewItem(_Now() & '|Verzeichnis umbenannt|' & $sPath & ' -> ' & $sNew, $idChangeLV)
    Case $SHCNE_RENAMEITEM
    GUICtrlCreateListViewItem(_Now() & '|Datei umbenannt|' & $sPath & ' -> ' & $sNew, $idChangeLV)
    Case $SHCNE_CREATE
    GUICtrlCreateListViewItem(_Now() & '|Datei erstellt|' & $sPath, $idChangeLV)
    Case $SHCNE_DELETE
    GUICtrlCreateListViewItem(_Now() & '|Datei gelöscht|' & $sPath, $idChangeLV)
    EndSwitch
    EndIf
    EndFunc ;==>WM_SHELLCHANGENOTIFY

    [/autoit]
  • Top!
    Das wäre mein nächster schritt gewesen, dafür zu sorgen das auch andere Verzeichnisse bzw Unterverzeichnisse mit kontrolliert werden. Wenn man betrachtet das das Skript mit _WinAPI_ShellChangeNotifyRegister noch "schuckelig" klein ist und in sciTe überraschend übersichtlich ist, scheint das wirklich die bessere Variante zu sein. Ich hätte eventuell auch ein GUI erstellen sollen, dadurch wird die ganze sache super übersichtlich, wobei ich keinen Koda Designer benutze, was mich dann immer davon abhählt da stundenlang mit den Maßen rumzuprobieren und ich will hier auf meinen Praktikum anfangen irgendwas zu designen :D
    Auf jeden Fall super gelungen, ich setzte mich jetzt ran und versuche die änderungen in eine Ini zu schrieben welche beim Computer neustart dann eventuell ausgelesen wird, damit der dialog im GUI nicht verloren geht und man noch schnell nachvollziehen kann, wann was passiert ist.
    Jetzt müsste ich noch dafür sorgen das sich das programm in den Autostart schreibt, also in die Registry aber das ist eher leicht gemacht, hab ich das gefühl ^^
    LG. Darnas/Mario :saint:

    EDIT: Selbst das Problem mit dem Array to cip and getclip ist soomit weg, und ich hab wieder einen freien zwischenspeichher :) :D

    Es gibt 102
    Arten von Menschen:
    Jene, die Binärcode verstehen
    und jene, die es nicht tun.