Beiträge von Bitnugger
-
-
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:
grep und egrep - Dateien rekursiv nach String durchsuchen
Dateien rekursiv nach String durchsuchen Dateien rekursiv nach String durchsuchen
Sucht man einen bestimmten String in einer Vielzahl an Dateien und Verzeichnissen könnten die folgenden Linux Befehle hilfreich sein.
grep: durchsucht eine Datei nach einem Suchstring
egrep: funktioniert wie grep, aber kann mit erweiterten regulären Ausdrücken umgehen
find: sucht bestimmte Dateien und wendet Befehle auf diese angrep und egrep
grep -r -i 'Suchstring' ./
./ das Verzeichnis, in dem die Dateien durchsucht werden sollen
-r auch alle Unterverzeichnisse rekursiv nach 'Suchstring' durchsuchen
-i Groß-/Kleinschreibung wird ignoriertHat man als Suchstring einen erweiterten regulären Ausdruck, benutzt man einfach egrep.
egrep -r -i 'Suchstring' ./
find und grep
Es gibt Linux Systeme, die das -r bei grep nicht unterstützen. Hier kann man sich mit find behelfen.find ./ -exec grep -i 'Suchstring' /dev/null {} \;
Quelle: grep all files and sub-directories in a directory for a string
-
So... bin ich zu dir... jetzt mit Edit-Control...
AutoIt: _Calc_DD.au3
Alles anzeigen;-- 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
-
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:
AutoIt
Alles anzeigen;-- 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
-
Am Anfang schriebst du, dass die Eingabezeichenfolge nur zweistellige Zahlen enthält. ...
Genau...
Ordnerüberwachung ist auch nicht schwierig...
AutoIt
Alles anzeigen#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
-
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:
AutoIt
Alles anzeigen_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
-
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:
AutoIt
Alles anzeigen#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
-
_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.
AutoItFunc _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
AutoIt
Alles anzeigen;-- 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 ;-----------------------------------------------------------------------------------------------------------------------------------------------------------------
-
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)