Ich denke bereits über das Format nach, der Inhalt kommt dann von allein (hoffentlich 😅🤞 ).
Ich würde über den Inhalt nachdenken... das Format ergibt sich dann quasi von selbst.
Ich denke bereits über das Format nach, der Inhalt kommt dann von allein (hoffentlich 😅🤞 ).
Ich würde über den Inhalt nachdenken... das Format ergibt sich dann quasi von selbst.
Brauchts ein Plugin oder kann er es von Haus aus?
Das kann TC von Haus aus.
Ich benutze übrigens TCUP, eine vorkonfigurierte Version von TC, bei der bereits etliche Erweiterungen installiert sind.
Peter S. Taler hat es treffend formuliert und ich habe dem nichts hinzuzufügen... also her damit!
In Dateien suchen (Alt+F7) mache ich am liebsten mit Total Commander...
Bevor ich das kannte, habe ich es mit grep/egrep gemacht, das im Paket GnuWin enthalten ist:
So... bin ich zu dir... jetzt mit Edit-Control...
;-- TIME_STAMP 2022-10-10 20:45:19
;~ #include <Array.au3> ; _ArrayToString
#include <APIShellExConstants.au3>
;~ #include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
Opt('TrayAutoPause', 0)
Global Const $g_sPath = @ScriptDir ; Die zu überwachenden Verzeichnisse (String oder Array)
Global $g_iID, $g_idEdit, $g_idDummy
OnAutoItExitRegister('OnAutoItExit')
_Main()
Func _Main()
Local $hWnd = GUICreate(@ScriptName, 640, 420)
Local $aCS = WinGetClientSize($hWnd)
$g_idEdit = GUICtrlCreateEdit('', 0, 0, $aCS[0], $aCS[1], BitOR($ES_AUTOVSCROLL, $WS_VSCROLL, $ES_MULTILINE, $ES_READONLY))
GUICtrlSetFont(-1, 11, 800, 0, 'Courier New')
$g_idDummy = GUICtrlCreateDummy()
GUISetState()
WinSetOnTop($hWnd, '', 1)
Local $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
;~ $g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT, $SHCNRF_NEWDELIVERY), $g_sPath, 1)
$g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, _
BitOR($SHCNE_ASSOCCHANGED, $SHCNE_CREATE, $SHCNE_RENAMEITEM, $SHCNE_UPDATEITEM), _ ; $SHCNE_CREATE ist eigtl. nur nötigt, wenn ausschließlich neue Dateien berücksichtig werden sollen!
BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_NEWDELIVERY), _
$g_sPath, 0)
If @error Then
MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Fehler', 'Das Fenster wurde nicht registriert.')
Exit
EndIf
Local $sPath, $sCalc, $hFile
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $g_idDummy
$sPath = GUICtrlRead($g_idDummy)
$sCalc = _Calc(FileRead($sPath)) ; "32 94 97 64 83 14 82 64 72" ==>> "32 06 97 36 83 86 82 36 72"
$hFile = FileOpen(StringRegExpReplace($sPath, '(?i)(.+)\.rns', '\1.rnt'), 2)
FileWrite($hFile, $sCalc) ; Eine bereits vorhandene *.rnt wird hiermit überschrieben!
FileClose($hFile)
EndSwitch
WEnd
EndFunc ;==>_Main
Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg
Local Static $bCreate = False
Local $aRes = DllCall("shell32.dll", "HANDLE", "SHChangeNotification_Lock", "wparam", $wParam, "lparam", $lParam, "ptr*", "", "ulong*", "")
;~ ConsoleWrite(@LF & "> SHChangeNotification_Lock $aRes --> " & _ArrayToString($aRes, '|') & @LF)
Local $PIDLIST_ABSOLUTE = $aRes[3]
Local $plEvent = $aRes[4]
Local $tPIDL = DllStructCreate('dword Item1; dword Item2', $PIDLIST_ABSOLUTE)
Local $sPath1 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item1'))
Local $sPath2 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item2'))
;~ ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $sPath1 --> " & $sPath1 & @LF)
;~ ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $sPath2 --> " & $sPath2 & @LF)
Switch $plEvent
Case $SHCNE_ASSOCCHANGED ; 0x8000000 A file type association has changed.
_AppendText(@CRLF & 'Case $SHCNE_ASSOCCHANGED' & @CRLF)
Case $SHCNE_CREATE ; 0x00000002 A non-folder item has been created.
$bCreate = True
Case $SHCNE_RENAMEITEM ; 0x00000001 The name of a non-folder item has changed.
_AppendText(@CRLF & '! Case $SHCNE_RENAMEITEM' & @CRLF & _
'> Alter Name: ' & $sPath1 & @CRLF & _
'> Neuer Name: ' & $sPath2 & @CRLF)
; zugehörige *.rnt umbenennen
Case $SHCNE_UPDATEITEM ; 0x00002000 An existing non-folder item has changed, but the item still exists and has not been renamed.
If StringRight($sPath1, 4) = '.rns' Then
_AppendText(@CRLF & '! ' & ($bCreate ? 'Neue' : 'Geänderte') & ' *.rns gefunden!' & @CRLF & _
'> Event: 0x' & Hex($plEvent) & ' ($SHCNE_UPDATEITEM) ' & @CRLF & _
'> Pfad1: ' & $sPath1 & @CRLF)
_SendToDummy($g_idDummy, $sPath1)
EndIf
$bCreate = False
;~ Case Else ; We don't care...
EndSwitch
$aRes = DllCall("shell32.dll", "int", "SHChangeNotification_Unlock", "HANDLE", $aRes[0])
;~ ConsoleWrite("> SHChangeNotification_Unlock $aRes --> " & _ArrayToString($aRes, '|') & @LF)
EndFunc ;==>WM_SHELLCHANGENOTIFY
Func _SendToDummy($idDummy, $sPath)
Local $iFileSize = FileGetSize($sPath)
If $iFileSize Then
_AppendText('+ Die Datei ist ' & $iFileSize & ' Bytes groß' & @CRLF & @CRLF)
GUICtrlSendToDummy($g_idDummy, $sPath)
Else
_AppendText('! Die Datei ist leer!' & @CRLF & @CRLF)
EndIf
EndFunc ;==>_SendToDummy
; Convert *.rns to *.rnt
Func _Calc($sSource)
Local $aArray = StringRegExp($sSource, '(\d{2})\s?', 3), $sSpace = StringInStr($sSource, ' ') ? ' ' : '', $sTarget
For $i = 1 To UBound($aArray) - 1 Step 2
;~ $sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], 100 - $aArray[$i])
$sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], StringRight(100 - $aArray[$i], 2))
Next
$sTarget = $i = UBound($aArray) ? $sTarget & $aArray[$i - 1] : StringTrimRight($sTarget, 1)
_AppendText('> Vorher (*.rns) = ' & $sSource & @CRLF & '- Danach (*.rnt) = ' & $sTarget & @CRLF & @CRLF) ; *** nur zur Anzeige
Return $sTarget
EndFunc ;==>_Calc
Func _AppendText($sText)
_GUICtrlEdit_AppendText($g_idEdit, $sText)
EndFunc
Func OnAutoItExit()
If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
EndFunc ;==>OnAutoItExit
Alles anzeigen
ja ich beziehe mich ja auch auf diesen Post, zumidest diese Zeile:
If Round($iFreeSpace, 1) <> Round($iFree, 1) Then ; Eine Stelle hinter dem Komma vergleichen
ist weder in deinem Vorschlag, noch in meinem Post, das hatte mich nur stutzig gemacht;)
Verstehe dich nicht... die Zeile ist doch in Post #24... und davon reden wir doch, oder?
Es geht doch lediglich darum, das GUICtrlSetData nur dann ausgeführt wird, wenn sich der freie Speicher geändert hat. Wenn das zu oft passiert, flackert das Label. Damit also nicht jede kleine Änderungen erfasst wird, kann man die Abfrage auf zwei oder nur eine Stelle hinter dem Komma begrenzen, oder auch nur die Zahlen vor dem Komma nehmen.
fehlt ein #include <GUIConstantsEx.au3>
Oh ja, habe ich nun hinzugefügt...
Eine RNS-Datei in einen andernen Dateityp umbenennen würde erkannt werden, umgekehrt jedoch nicht.
Ja, will man das, muss die Abfrage entsprechen angepasst werden... den alten Namen bekommst du mit "Item1", den neuen mit "Item2".
$SHCNE_UPDATEITEM tritt laut Beschreibung nur bei Veränderung des Inhaltes eines Elementes auf, hier also nicht nötig.
Wir benötigen ja nicht nur den Namen des Pfades, sondern vor allem auch den Inhalt der Datei... den es aber evtl. noch nicht gibt, nachdem die Datei erstellt wurde ($SHCNE_CREATE) - z.B. mit FileOpen("filename.rns", $FO_OVERWRITE) - hier greift dann $SHCNE_UPDATEITEM, nachdem die Daten geschrieben wurden!
Da die Aufgabenstellung nur das Erkennen von neuen *.rns vorgibt, brauchen wir $SHCNE_CREATE und $SHCNE_UPDATEITEM, jedoch kein $SHCNE_ASSOCCHANGED. Das kann man natürlich auch noch abfragen, genauso wie $SHCNE_RENAMEITEM, wenn die Datei umbenannt wurde und nun vielleicht keine *.rns mehr ist. Das war aber nicht gefragt.
Den ersten Zitatsatz weiß ich leider nicht vollständig umzusetzen.
So habe ich das verstanden:
Durch $SHCNRF_NEWDELIVERY wird für empfangene Nachrichten gemeinsam genutzter Speicher verwendet. SHChangeNotification_Lock rufst du auf, um auf die eigentlichen Daten zuzugreifen. SHChangeNotification_Unlock rufst du auf, um den Speicher wieder freizugeben, wenn du fertig sind.
Schau mal hier, wie KaFu das gelöst hat.
Ansonsten... sehr schön umgesetzt.
Hier noch meine Version - die *.rnt wird hiermit auch erstellt:
;-- TIME_STAMP 2022-10-09 21:25:24
;~ #include <Array.au3> ; _ArrayToString
#include <APIShellExConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
Opt('TrayAutoPause', 0)
Global Const $g_sPath = @ScriptDir ; Die zu überwachenden Verzeichnisse (String oder Array)
Global $g_iID, $g_idDummy
OnAutoItExitRegister('OnAutoItExit')
_Main()
Func _Main()
Local $hWnd = GUICreate(@ScriptName)
$g_idDummy = GUICtrlCreateDummy()
GUISetState()
Local $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
;~ $g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT, $SHCNRF_NEWDELIVERY), $g_sPath, 1)
$g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, _
BitOR($SHCNE_ASSOCCHANGED, $SHCNE_CREATE, $SHCNE_RENAMEITEM, $SHCNE_UPDATEITEM), _
BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_NEWDELIVERY), _
$g_sPath, 0)
If @error Then
MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Fehler', 'Das Fenster wurde nicht registriert.')
Exit
EndIf
Local $sPath, $sCalc, $hFile
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $g_idDummy
$sPath = GUICtrlRead($g_idDummy)
$sCalc = _Calc(FileRead($sPath)) ; "32 94 97 64 83 14 82 64 72" ==>> "32 06 97 36 83 86 82 36 72"
$hFile = FileOpen(StringRegExpReplace($sPath, '(?i)(.+)\.rns', '\1.rnt'), 2)
FileWrite($hFile, $sCalc)
FileClose($hFile)
EndSwitch
WEnd
EndFunc ;==>_Main
Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg
Local $aRes = DllCall("shell32.dll", "HANDLE", "SHChangeNotification_Lock", "wparam", $wParam, "lparam", $lParam, "ptr*", "", "ulong*", "")
;~ ConsoleWrite(@LF & "> SHChangeNotification_Lock $aRes --> " & _ArrayToString($aRes, '|') & @LF)
Local $PIDLIST_ABSOLUTE = $aRes[3]
Local $plEvent = $aRes[4]
Local $tPIDL = DllStructCreate('dword Item1; dword Item2', $PIDLIST_ABSOLUTE)
Local $sPath1 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item1'))
Local $sPath2 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item2'))
;~ ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $sPath1 --> " & $sPath1 & @LF)
;~ ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $sPath2 --> " & $sPath2 & @LF)
Switch $plEvent
Case $SHCNE_ASSOCCHANGED ; 0x8000000 A file type association has changed.
ConsoleWrite(@CRLF & 'Case $SHCNE_ASSOCCHANGED' & @CRLF)
Case $SHCNE_CREATE ; 0x00000002 A non-folder item has been created.
If StringRight($sPath1, 4) = '.rns' Then
ConsoleWrite(@CRLF & '! Neue *.rns gefunden!' & @CRLF & _
'> Event: 0x' & Hex($plEvent) & ' ($SHCNE_CREATE) ' & @CRLF & _
'> Pfad1: ' & $sPath1 & @CRLF)
_SendToDummy($g_idDummy, $sPath1)
EndIf
Case $SHCNE_RENAMEITEM ; 0x00000001 The name of a non-folder item has changed.
ConsoleWrite(@CRLF & '! Case $SHCNE_RENAMEITEM' & @CRLF & _
'> Alter Name: ' & $sPath1 & @CRLF & _
'> Neuer Name: ' & $sPath2 & @CRLF)
; zugehörige *.rnt umbenennen
Case $SHCNE_UPDATEITEM ; 0x00002000 An existing non-folder item has changed, but the item still exists and has not been renamed.
If StringRight($sPath1, 4) = '.rns' Then
ConsoleWrite(@CRLF & '! Geänderte *.rns gefunden!' & @CRLF & _
'> Event: 0x' & Hex($plEvent) & ' ($SHCNE_UPDATEITEM) ' & @CRLF & _
'> Pfad1: ' & $sPath1 & @CRLF)
_SendToDummy($g_idDummy, $sPath1)
EndIf
;~ Case Else ; We don't care...
EndSwitch
$aRes = DllCall("shell32.dll", "int", "SHChangeNotification_Unlock", "HANDLE", $aRes[0])
;~ ConsoleWrite("> SHChangeNotification_Unlock $aRes --> " & _ArrayToString($aRes, '|') & @LF)
EndFunc ;==>WM_SHELLCHANGENOTIFY
Func _SendToDummy($idDummy, $sPath)
Local $iFileSize = FileGetSize($sPath)
If $iFileSize Then
ConsoleWrite('+ _SendToDummy: Die Datei ist '&$iFileSize&' Bytes gross ==>> ' & $sPath & @CRLF & @CRLF)
GUICtrlSendToDummy($g_idDummy, $sPath)
Else
ConsoleWrite('! _SendToDummy: Die Datei ist leer! ==>> ' & $sPath & @CRLF & @CRLF)
EndIf
EndFunc ;==>_SendToDummy
Func _Calc($sSource)
Local $aArray = StringRegExp($sSource, '(\d{2})\s?', 3), $sSpace = StringInStr($sSource, ' ') ? ' ' : '', $sTarget
For $i = 1 To UBound($aArray) - 1 Step 2
;~ $sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], 100 - $aArray[$i])
$sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], StringRight(100 - $aArray[$i], 2))
Next
$sTarget = $i = UBound($aArray) ? $sTarget & $aArray[$i - 1] : StringTrimRight($sTarget, 1)
ConsoleWrite('> Vorher = ' & $sSource & @CRLF) ; *** nur zur Anzeige
ConsoleWrite('- Danach = ' & $sTarget & @CRLF & @CRLF) ; *** nur zur Anzeige
Return $sTarget
EndFunc ;==>_Calc
Func OnAutoItExit()
If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
EndFunc ;==>OnAutoItExit
Alles anzeigen
Am Anfang schriebst du, dass die Eingabezeichenfolge nur zweistellige Zahlen enthält. ...
Genau...
Ordnerüberwachung ist auch nicht schwierig...
#include <APIShellExConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
Opt('TrayAutoPause', 0)
Global Const $g_sPath = @ScriptDir ; Die zu überwachenden Verzeichnisse (String oder Array)
Global $g_iID
OnAutoItExitRegister('OnAutoItExit')
_Main()
Func _Main()
Local $hWnd = GUICreate('')
GUISetState()
Local $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
$g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT), $g_sPath, 1)
If @error Then
MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Fehler', 'Das Fenster wurde nicht registriert.')
Exit
EndIf
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
EndFunc ;==>_Main
Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg
Local Static $bCreate = False
Local $sPath = _WinAPI_ShellGetPathFromIDList(DllStructGetData(DllStructCreate('dword Item1; dword Item2', $wParam), 'Item1'))
If $sPath Then
If $bCreate And ($lParam = $SHCNE_UPDATEITEM) Then ; 0x00002000 - nach $SHCNE_CREATE folgt immer ein $SHCNE_UPDATEITEM!
If StringRight($sPath, 4) = '.rns' Then
ConsoleWrite('! Neue *.rns gefunden!' & @CRLF)
ConsoleWrite('> Event: 0x' & Hex($lParam) & ' ($SHCNE_UPDATEITEM) | Pfad: ' & $sPath & @CRLF)
EndIf
EndIf
$bCreate = $lParam = $SHCNE_CREATE ; 0x00000002
Else
ConsoleWrite('@ Event: 0x' & Hex($lParam) & @CRLF)
EndIf
EndFunc ;==>WM_SHELLCHANGENOTIFY
Func OnAutoItExit()
If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
EndFunc ;==>OnAutoItExit
Alles anzeigen
Diese beiden Zeilen sind in dem Script nicht vorhanden
Das bezieht sich natürlich auf die Funktion in Post #24... wobei dein Quote so nicht richtig ist.
Welche Zeile? Eine von diesen hier; welche, ist deine Wahl.
If $iFreeSpace <> $iFree Then ; Zwei Stellen hinter dem Komma vergleichen
If Int($iFreeSpace) <> Int($iFree) Then ; Nur Ganzzahlen vergleichen
If Round($iFreeSpace, 1) <> Round($iFree, 1) Then ; Eine Stelle hinter dem Komma vergleichen
Und wie erledigst du dann die Umwandlung des Arrays in einen String ohne zweite Schleife, vor allem wenn die Anzahl der Doppelziffern ungerade ist?
So würde ich es dann machen:
_Calc('32 94 97 64 83 14 82 64 72')
_Calc('32 94 97 64 83 14 82 64')
_Calc('329497648314826472')
_Calc('3294976483148264')
Func _Calc($sSource)
Local $aArray = StringRegExp($sSource, '(\d{2})\s?', 3), $sSpace = StringInStr($sSource, ' ') ? ' ' : '', $sTarget
For $i = 1 To UBound($aArray) -1 Step 2
$sTarget &= StringFormat('%02i'&$sSpace&'%02i' & $sSpace, $aArray[$i -1], 100 - $aArray[$i])
Next
$sTarget = $i = UBound($aArray) ? $sTarget & $aArray[$i -1] : StringTrimRight($sTarget, 1)
ConsoleWrite('> Vorher = ' & $sSource & @CRLF) ; *** nur zur Anzeige
ConsoleWrite('- Danach = ' & $sTarget & @CRLF) ; *** nur zur Anzeige
ConsoleWrite(@CRLF)
Return $sTarget
EndFunc
Alles anzeigen
Na gut, bei so vielen Lösungen fehlt ja eigentlich nur noch der obligatorische Einzeiler:
If Mod($i, 2) = 0 Then _ ; Jeder zweite Eintrag
Das kannst du auch direkt mit dem For erledigen...
For $i = 1 To $Array[0] Step 2
So geht es auch:
#include <StringConstants.au3>
_Calc("32 94 97 64 83 14 82 64 72") ; ==>> 32 06 97 36 83 86 82 36 72
_Calc("329497648314826472") ; ==>> 320697368386823672
Func _Calc($sEingangsstring)
Local $aRx = StringRegExp($sEingangsstring, '\d{2}', $STR_REGEXPARRAYGLOBALMATCH)
Local $sAusgangsstring, $sSpace = StringInStr($sEingangsstring, ' ') ? ' ' : ''
For $i = 0 To UBound($aRx) -1 Step 1
$sAusgangsstring &= StringFormat('%02i%s', (Mod($i, 2) ? 100 - $aRx[$i] : $aRx[$i]), $sSpace)
Next
ConsoleWrite('> $sEingangsstring : ' & $sEingangsstring & @CRLF)
ConsoleWrite('- $sAusgangsstring : ' & $sAusgangsstring & @CRLF & @CRLF)
Return $sAusgangsstring
EndFunc
Alles anzeigen
_WinAPI_GetKeyboardState() fällt mir da noch ein...
ich hatte Deinen Ansatz auch probiert Bit, ebenfalls das selbe.
Ich hatte AdlibRegister auf 1000 gesetzt und bei mir ist der Effekt nicht zu sehen... das Label wird bei mir auch nur etwa 1x / Std. geändert.
Func _Testspace()
Local $iFree = Round(DriveSpaceFree($sSystemDrive) / 1024, 2)
If $iFreeSpace <> $iFree Then
ConsoleWrite('_Testspace('&$iFree&' GB)' & @CRLF)
$iFreeSpace = $iFree
GUICtrlSetData($idLabelSpace, 'Freier Speicher auf SystemDrive ('&$sSystemDrive&')' & ($iFree < $SW ? ' wird knapp!: ' : ' : ') & $iFree & ' GB')
EndIf
EndFunc ;==>_Testspace
Wenn das bei dir viel öfter passiert, dann ändere die Funktion so ab:
Dafür is der schwarze Balken wieder da, wenn die BEdingung erfült ist und er das Label zeigen soll.
Klar, wenn du 10 x pro Sekunde den Text des Labels änderst, dann flackert es... in meinem letzten Script habe ich es so geändert, das nur dann der neue Text (bzw. Zahl) geschrieben wird, wenn er sich geändert hat. Ist dir wohl entgangen...
Mir ist noch ein ähnlicher Effekt aufgefallen,
den du sebst verursachst... du hast da ein paar fette Fehler drin... hier mal eine "leicht" korrigierte Version...
PS: GuiCtrlSetOnHover_UDF.au3 ist bei mir GuiCtrlOnHover.au3
;-- TIME_STAMP 2022-10-04 20:09:25
#include-once
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#include <FontConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
#include <StringConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <Date.au3>
#include <GDIPlus.au3>
#include <String.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIGdiInternals.au3>
#include <WinAPIHObj.au3>
#include <WinAPISysInternals.au3>
#include <WinApi.au3>
#include "GUIBkImage.au3"
#include "Services.au3"
#include <GuiCtrlOnHover.au3>
;~ FileInstall("C:\Users\user\Pictures\scr09082022-084252.bmp", "C:\Windows\Temp\hg.bmp", 1)
;~ FileInstall("F:\Eigene Dateien\Pictures\GIRLS\Girls - Real\Tricia Helfer\Tricia Helfer 03.bmp", "F:\Eigene Dateien\Pictures\GIRLS\Girls - Real\!-Unsortiert\Adriana Slenkaja.bmp", 1)
Opt('MustDeclareVars', 1)
;Opt("TrayAutoPause", 0)
Global $ActiveCheck, $result
Global $ARRAY_COLOR_TOP_MIN[3] = [36, 65, 142]
Global $ARRAY_COLOR_TOP_MAX[3] = [11, 42, 122]
Global $idLbl_Close = 1
Global $ROUNDES = 20, $LastHwnd = 0
Global $LastHwnd
Global $GUIBKCOLOR = 0x738599
Global $SubBack = 0xEAF0E2
Global $idPic
Global $SW = 20 ; GB
Global Const $sSystemDrive = StringLeft(@WindowsDir, 2) ; SystemDrive auslesen
Global $iFreeSpace = 0
Global $idLabelSpace, $labelTemp, $temp
Global $aPics = ['F:\Eigene Dateien\Pictures\GIRLS\Girls - Real\Tricia Helfer\Tricia Helfer 03.bmp', 'F:\Eigene Dateien\Pictures\GIRLS\Girls - Cyber\Kim_02.bmp']
AdlibRegister('_Testspace', 1000)
Global $hGui = RBoxCreate("Integrator 4 Release 076", 840, 625)
While True
CheckX($hGui, $idLbl_Close, 0xA3A3A3, 0x555555)
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idLbl_Close
GUIDelete($hGui)
AdlibUnRegister('_Testspace')
Exit
EndSwitch
WEnd
Func RBoxCreate($sTitle, $width, $height, $left = -1, $top = -1, $show = 1)
Local $hGUI = GUICreate($sTitle, $width, $height, $left, $top, $WS_POPUP)
_GuiRoundCorners($hGUI, 0, 0, $ROUNDES, $ROUNDES)
$idPic = GUICtrlCreatePic($aPics[0], 0, 25, 920, 660)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetBkColor($GUIBKCOLOR, $hGUI)
;~ _createButtons()
;~ _createLabels()
$idLbl_Close = GUICtrlCreateLabel('X', $width - 20, 3, 25, 25)
GUICtrlSetCursor($idLbl_Close, 0)
GUICtrlSetBkColor($idLbl_Close, -2)
GUICtrlSetFont($idLbl_Close, 15, 800)
GUICtrlSetColor($idLbl_Close, 0x555555)
$sTitle &= " "
Local $idTitle = GUICtrlCreateLabel($sTitle, 0, 0, $width - 20, 26, $SS_CENTER, $GUI_WS_EX_PARENTDRAG) ; "Integrator 4 Release 076 "
GUICtrlSetFont($idTitle, 17, 400, 0, "Consolas")
GUICtrlSetBkColor($idTitle, -2)
$idLabelSpace = GUICtrlCreateLabel('', 5, 600, 370, 20)
GUICtrlSetColor(-1, 0xF00404) ; red
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 10, 100) ; bold
GUICtrlSetState(GUICtrlCreateGraphic(0, 0, $width, 25), $GUI_DISABLE) ; Wofür soll das gut sein?
If $show = 1 Then GUISetState(@SW_SHOW, $hGUI)
Return $hGUI
EndFunc ;==>RBoxCreate
Func _Testspace()
ConsoleWrite('_Testspace()' & @CRLF)
Local $iFree = Round(DriveSpaceFree($sSystemDrive) / 1024, 2)
If $iFreeSpace <> $iFree Then
$iFreeSpace = $iFree
GUICtrlSetData($idLabelSpace, 'Freier Speicher auf SystemDrive:' & ($iFree < $SW ? ' wird knapp!: ' : ' ') & $iFree & ' GB')
EndIf
EndFunc ;==>_Testspace
Func CheckX($hGui, $CtrlID, $sCMD, $eCMD)
Local $aCursorInfo = GUIGetCursorInfo($hGui)
If @error Then Return 0
If $LastHwnd <> $aCursorInfo[4] Then
$LastHwnd = $aCursorInfo[4]
Return GUICtrlSetColor($idLbl_Close, $aCursorInfo[4] = $CtrlID ? $sCMD : $eCMD)
EndIf
EndFunc ;==>CheckX
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
Dim $pos, $ret
$pos = WinGetPos($h_win)
$ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3)
If $ret[0] Then
$ret = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
Return $ret[0] ? 1 : 0
EndIf
Return 0
EndFunc ;==>_GuiRoundCorners
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Func GradientFill($im, $x1, $y1, $width, $height, $left_color, $right_color)
Local $color0 = ($left_color[0] - $right_color[0]) / $height, $color1 = ($left_color[1] - $right_color[1]) / $height
Local $color2 = ($left_color[2] - $right_color[2]) / $height
For $Y = 0 To $height - 1
Local $red = $left_color[0] - Floor($Y * $color0)
Local $green = $left_color[1] - Floor($Y * $color1)
Local $blue = $left_color[2] - Floor($Y * $color2)
Local $col = Dec(Hex($blue, 2) & Hex($green, 2) & Hex($red, 2))
GUICtrlSetGraphic($im, $GUI_GR_COLOR, $col)
GUICtrlSetGraphic($im, $GUI_GR_MOVE, 0, $Y)
GUICtrlSetGraphic($im, $GUI_GR_LINE, $width, $Y)
Next
GUICtrlSetGraphic($im, $GUI_GR_COLOR, 0x000000)
GUICtrlSetGraphic($im, $GUI_GR_MOVE, 0, $height)
GUICtrlSetGraphic($im, $GUI_GR_LINE, $width, $height)
GUICtrlSetGraphic($im, $GUI_GR_REFRESH)
EndFunc ;==>GradientFill
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Alles anzeigen
GUIDelete($hGui)
Nach dieser Zeile muss ein Exit folgen... denn ohne GUI gibt es auch keine Msg und dein Script funktioniert somit nicht mehr korrekt.
local $gMsg = GUIGetMsg()
Außerhalb einer Funktion sind alle Variablen Global und es ist dabei völlig egal, ob du sie mit Local oder Global deklarierst!
Zudem sollte die Deklaration besser vor dem While stehen. In deinem Fall ist die Variable aber eh überflüssig, weil du sie ja lediglich einmalig für Switch benötigst... da kannst du es besser so machen:
Switch GUIGetMsg()
das lauffähige Beispiel hatte ich doch gepostet, ich habe es doch auch entsprechend den Vorschlägen von Mombass gepostet! Da er ja gesagt hatte, er konnte das Problem nachvollziehen, kann ich nun Deine Einlassung nicht ganz nachvollziehen. Soll ich den Inhalt von den UDFs posten, meinst Du das? Oder das Hintergrundbild? Ich hatte es mit meheren Bildern und Formaten probiert,
...aber es hat nicht funktioniert.
Hm, ja, das ist dann natürlich schwierig bis unmöglich für dich und auch nicht dein Vergehen, wenn das Forum Zicken wegen zu großer Dateianhänge macht.
Solange Gun-Food das nicht gefixt hat, geht das wohl nicht so, wie Musashi es empfohlen hat. Bis dahin kannst du als Workaround einfach den Inhalt der UDFs posten; aber setzte sie in Code-Tags! Mit Bildern ist es schwieriger... verkleinere sie einfach, damit der Upload klappt, oder verwende Bilder, die mit AutoIt installiert wurden, z.B.: "c:\Program Files (x86)\AutoIt3\Examples\Helpfile\Extras\Compass.bmp"
Hust... was soll dass denn werden?
So macht es Sinn:
$BG = GUICtrlCreatePic('C:\Windows\Temp\hg.bmp', 0, 25, 920, 660)