Wieso eine Eingabe über mehrere Input-Controls, wenn Du einfach GUICtrlCreateDate (siehe mein obiges Beispiel) benutzen kannst?
Dort gibt es das Problem gar nicht. Es wird nämlich immer richtig zurückgegeben. Und es sind auch vom Anwender keine Falscheingaben möglich.
Beiträge von Oscar
-
-
Ich hatte mal eine kleine Funktion geschrieben, mit der man einen Dateinamen zurückbekommt, der noch nicht existiert (Zähler angehängt).
Diese Funktion kannst Du vor dem FileMove mit dem Zielnamen aufrufen und mit dem zurückgegebenen Dateinamen dann FileMove aufrufen.Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$sFilename = @AutoItExe
$sFilename = _GetUniqueFileName($sFilename)
If @error Then
ConsoleWrite('Fehler = ' & @error & @CR)
Else
ConsoleWrite('Dateiname = "' & $sFilename & '"' & @CR)
EndIf;===============================================================================
[/autoit]
; Function Name: _GetUniqueFileName($sPath)
; Description:: Wenn der Dateiname bereits existiert wird ein Zähler
; in Form von: "_(1)" an den Dateinamen angehängt.
; Parameter(s): $sPath = kompletter Pfad der Datei
; Requirement(s): -
; Return Value(s): bei Erfolg = der (neue) Dateiname
; bei Fehler wird @error = 1 (Pfad falsch angegeben)
; Author(s): Oscar (http://www.autoit.de)
;===============================================================================
Func _GetUniqueFileName($sPath)
Local $aPath, $sNumber = '', $iCount = 0
$aPath = StringRegExp($sPath, '(.+\\)(.+?)(?:_\(\d*\))*(\..+)', 3)
If @error Then Return SetError(1, 0, 0)
While FileExists($aPath[0] & $aPath[1] & $sNumber & $aPath[2])
$iCount += 1
$sNumber = '_(' & $iCount & ')'
WEnd
Return $aPath[0] & $aPath[1] & $sNumber & $aPath[2]
EndFunc ;==>_GetUniqueFileName -
Ach übrigens!
Durch den Start einer Anwendung wird bei mir sehr wohl die Startleiste wieder eingeblendet und verschwindet wieder, wenn ich die Anwendung schließe.
Ist das bei dir nicht so? (Auf meinem Rechner habe ich Win 8.1)
Bei mir mit Win 7, 64 Bit bleibt die Taskleiste und der Startbutton ausgeblendet, während der gesamten Laufzeit des Programms.Das starten mehrerer Programme ist eigentlich sogar einfacher (funktioniert allein durch weglassen einiger Befehle).
Hier mal die MultiTasking-Version:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include '_GuiCtrlSetImageEx.au3'OnAutoItExitRegister('_OnExit')
[/autoit] [autoit][/autoit] [autoit]
Opt('GUIOnEventMode', 1)
Opt('WinTitleMatchMode', 4)
_myTaskHS(True) ; Taskleiste und Startbutton versteckenGlobal $iGuiWidth = Int(@DesktopWidth / 2) ; halbe Desktopbreite als Gui-Breite
[/autoit] [autoit][/autoit] [autoit]
Global $iGuiHeight = Int(@DesktopHeight / 2) ; halbe Desktophöhe als Gui-Höhe
Global $aBkColor[4] = [0x84b5d6, 0xfacd94, 0xd69cd7, 0xe6f791] ; die Hintergrundfarben für die 4 virtuellen Desktops
Global $sImagePath = @ScriptDir & '\img\' ; Pfad für die Icondateien
Global $iIconSize = 128 ; Größe der Icons
Global $ahGui[4] ; Array für die Gui-Handles
Global $hMainGui = GUICreate('VDesktop', 0, 0, 0, 0) ; Hauptfenster erstellen
GUISetOnEvent($GUI_EVENT_CLOSE, '_GuiDelete')
GUISetState(@SW_SHOW, $hMainGui) ; Hauptfenster anzeigen
For $i = 0 To 3
$ahGui[$i] = GUICreate('Desktop' & $i + 1, $iGuiWidth, $iGuiHeight, Mod($i, 2) * $iGuiWidth, Int($i / 2) * $iGuiHeight, $WS_POPUP, -1, $hMainGui) ; Gui erstellen
GUISetBkColor($aBkColor[$i], $ahGui[$i]) ; Hintergrundfarbe setzen
GUISetOnEvent($GUI_EVENT_CLOSE, '_GuiDelete')
GUISetState(@SW_SHOW, $ahGui[$i]) ; Gui anzeigen
GUICtrlCreateLabel($i + 1, 4, 4, 28, 28) ; Label zur Anzeige der VDesktop-Nummer (jeweils oben links)
GUICtrlSetFont(-1, 20, 600, 0, 'Verdana', 5)
GUICtrlSetColor(-1, 0x444444)
Next; das folgende Array $aApp beeinhaltet alle Daten für die Anwendungen:
[/autoit] [autoit][/autoit] [autoit]
; 1. Wert = der virtuelle Desktop
; 2. und 3. Wert = die Koordinaten (Left/Top) für das Icon
; 4. Wert = das PNG-Bild, das für die Anwendung angezeigt werden soll
; 5. Wert = Pfad zu der Anwendung
; 6. Wert = die Fensterklasse (das ist die sicherste Methode, das richtige Fenster zu erkennen)
Global $aApp[4][6] = [ _
[0, 30, 30, 'calc.png', 'calc.exe', '[CLASS:CalcFrame]'], _
[1, 30, 30, 'firefox.png', @ProgramFilesDir & '\Mozilla Firefox\firefox.exe', '[CLASS:MozillaWindowClass]'], _
[2, 30, 30, 'notepad.png', 'notepad.exe', '[CLASS:Notepad]'], _
[3, 30, 30, 'paint.png', @WindowsDir & '\system32\mspaint.exe', '[CLASS:MSPaintApp]']]Global $aidApp[UBound($aApp)], $iGui
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To UBound($aApp) - 1
[/autoit] [autoit][/autoit] [autoit]
$iGui = $aApp[$i][0] ; auf welchem VDesktop soll das Icon erstellt werden?
GUISwitch($ahGui[$iGui]) ; auf diese Gui switchen
$aidApp[$i] = GUICtrlCreatePic('', $aApp[$i][1], $aApp[$i][2], $iIconSize, $iIconSize) ; an den gespeicherten Koordinaten ein Pic-Control erstellen
GUICtrlSetCursor(-1, 0) ; den Mauszeiger beim drüberfahren in eine Hand umwandeln
GUICtrlSetOnEvent(-1, '_StartApp') ; beim anklicken des Icons wird diese Funktion ausgeführt
_GuiCtrlSetImageEx(-1, $sImagePath & $aApp[$i][3]) ; hier wird das PNG-Bild geladen und dem Pic-Control zugewiesen
Next
_SetGuiOnTop(1) ; Die VDesktops OnTop setzen
_SetGuiOnTop(0) ; Die VDesktops nicht mehr OnTop setzenWinWaitClose($hMainGui) ; warten, bis das Hauptfenster geschlossen wurde
[/autoit] [autoit][/autoit] [autoit]
ExitFunc _OnExit()
[/autoit] [autoit][/autoit] [autoit]
_myTaskHS(False) ; Taskleiste und Startbutton wieder anzeigen
EndFunc ;==>_OnExitFunc _GuiDelete()
[/autoit] [autoit][/autoit] [autoit]
For $hGui In $ahGui
GUIDelete($hGui)
Next
GUIDelete($hMainGui)
EndFunc ;==>_GuiDeleteFunc _StartApp()
[/autoit] [autoit][/autoit] [autoit]
Local $hWnd, $iIndex = @GUI_CtrlId - $aidApp[0] ; den Index der angeklickten Anwendung ermitteln
If Not WinExists($aApp[$iIndex][5]) Then ; wenn das Fenster noch nicht existiert, dann...
Run($aApp[$iIndex][4]) ; die App starten
If @error Then Return ; wenn beim starten ein Fehler aufgetreten ist, dann Funktion abbrechen
$hWnd = WinWait($aApp[$iIndex][5]) ; auf das Fenster warten (Handle wird zurückgegeben)
Else
$hWnd = WinGetHandle($aApp[$iIndex][5]) ; das Fenster existiert bereits (Handle holen)
EndIf
WinSetOnTop($hWnd, '', 1) ; Fenster OnTop setzen
WinSetState($hWnd, '', @SW_SHOW) ; App anzeigen
EndFunc ;==>_StartAppFunc _SetGuiOnTop($iFlag = 0)
[/autoit] [autoit][/autoit] [autoit]
For $hGui In $ahGui
WinSetOnTop($hGui, '', $iFlag)
Next
EndFunc ;==>_SetGuiOnTopFunc _myTaskHS($f_hide = False)
[/autoit]
Local $h_task = WinGetHandle('[CLASS:Shell_TrayWnd]')
If Not $h_task Then Return SetError(1, 0, 0)
Local $h_start = 0
Local $a_wlist = WinList('[CLASS:Button]')
If Not IsArray($a_wlist) Then Return SetError(2, 0, 0)
For $iwin = 1 To $a_wlist[0][0]
If _WinAPI_GetParent($a_wlist[$iwin][1]) = $h_task Then
$h_start = $a_wlist[$iwin][1]
ExitLoop
EndIf
Next
If Not $h_start Then Return SetError(3, 0, 0)
If $f_hide Then
_WinAPI_ShowWindow($h_start, @SW_HIDE)
_WinAPI_ShowWindow($h_task, @SW_HIDE)
Else
_WinAPI_ShowWindow($h_start, @SW_SHOW)
_WinAPI_ShowWindow($h_task, @SW_SHOW)
EndIf
EndFunc ;==>_myTaskHSWie bereits gesagt, ich wusste nicht, welche Features gewünscht sind. Ich habe keine Erfahrung mit geistig Behinderten und wie sie mit Computerprogrammen umgehen.
Falls Du bei dem Programm noch Hilfe brauchst, solltest Du vielleicht mal etwas ausführlicher auf die speziellen Anforderungen eingehen. -
Und weil morgen Nikolaus ist, gibt's von mir ein komplettes Beispielscript:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Date.au3>
#include <DateTimeConstants.au3>
#include <GUIConstantsEx.au3>GUICreate("Auto-Mouse-Move", 380, 140)
[/autoit] [autoit][/autoit] [autoit]
Global $idBegin = GUICtrlCreateDate("", 90, 20, 80, 30, $DTS_TIMEFORMAT)
GUICtrlSetFont(-1, 14)
GUICtrlSendMsg($idBegin, $DTM_SETFORMATW, 0, "HH:mm")
GUICtrlCreateLabel('-', 190, 18, 30, 30)
GUICtrlSetFont(-1, 20)
Global $idEnd = GUICtrlCreateDate("", 220, 20, 80, 30, $DTS_TIMEFORMAT)
GUICtrlSetFont(-1, 14)
GUICtrlSendMsg($idEnd, $DTM_SETFORMATW, 0, "HH:mm")
Global $idActivateAMM = GUICtrlCreateCheckbox('Aktiviere Auto-Mouse-Move', 100, 80, 200, 20)
GUICtrlSetFont(-1, 10)
GUISetState(@SW_SHOW)While True
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $idActivateAMM
If BitAND(GUICtrlRead($idActivateAMM), $GUI_CHECKED) Then
AdlibRegister('_MoveMouse', 500)
Else
AdlibUnRegister('_MoveMouse')
EndIf
EndSwitch
WEndFunc _MoveMouse()
[/autoit]
Local $sTimeBegin = StringFormat('%04i/%02i/%02i ', @YEAR, @MON, @MDAY) & GUICtrlRead($idBegin) & ':00'
Local $sTimeEnd = StringFormat('%04i/%02i/%02i ', @YEAR, @MON, @MDAY) & GUICtrlRead($idEnd) & ':00'
$sTimeEnd = _DateAdd('D', Abs(_DateDiff('D', $sTimeBegin, $sTimeEnd)), $sTimeEnd)
Local $sNow = _NowCalc()
If _DateDiff('s', $sTimeBegin, $sNow) > 0 And _DateDiff('s', $sTimeEnd, $sNow) < 0 Then
Local $aPos = MouseGetPos()
MouseMove($aPos[0] + 2, $aPos[1] + 2)
MouseMove($aPos[0] - 2, $aPos[1] - 2)
MouseMove($aPos[0], $aPos[1])
EndIf
EndFunc ;==>_MoveMouse -
Wie KloMeister schon schreibt, vergleichst Du zwei Strings miteinander. Dabei wird von links nach rechts verglichen und nicht nach Uhrzeit (das Format kennt AutoIt nicht).
Also würde ich für die Eingabe nicht eine InputBox verwenden, sondern eine GUI mit GUICtrlCreateDate (Beispiel 3 in der Hilfe zeigt, wie man dann auch nur die Uhrzeit eingeben kann).
Das schließt dann auch gleich Fehleingaben aus.
Wenn Du dann die Uhrzeiten im Format "HH:MM:SS" speicherst, kannst Du _DateDiff für den Vergleich verwenden.
Auf jeden Fall solltest Du auch beachten, dass die Anfangszeit größer als die Endzeit sein kann (Übernachtmodus). -
Was sich mir nicht so schnell erschließen wird, wo dein Codse pragmatischer / effizienter / sicherer ist.
Bzw. wo in meinen Code die heftigsten Fallstricke sind, mit denen du "nicht leben" kannst.Ich habe die Kacheln als einzelne Fenster erstellt. Das hat den Vorteil, dass man die Koordinaten für die Anwendungen jeweils Kachelbezogen angeben kann.
So ist es auch ganz einfach eine Anwendung auf eine andere Kachel zu verlegen. Die Koordinaten bleiben gleich, nur der Eintrag für die Kachel wird geändert.Ich persönlich bevorzuge auch den OnEventMode (gerade bei mehreren GUIs). Dieser Modus führt dazu, dass man mehr in Funktionen schreibt (IMHO weniger
fehleranfällig oder zumindest leichter zu debuggen).Die Taskleiste und den Startbutton habe ich bei meiner Variante ausgeblendet (bei Programmende werden sie wieder angezeigt).
Ich habe das jetzt so geschrieben habe, dass nur eine Anwendung gleichzeitig gestartet werden kann (Programm wartet auf das beenden der Anwendung).
Ich weiß nicht, ob das so gewünscht ist oder nicht. Wenn nicht, lässt sich das auch ändern. -
Die Idee finde ich ganz witzig, aber die Umsetzung gefällt mir nicht so sehr.
Ich habe Dir mal einen neuen Anfang geschrieben. Du darfst das Script gern benutzen und das Ganze erweitern.
Ich hoffe, Du verstehst das Script (ich habe diverse Kommentare eingefügt).
Falls es noch Fragen gibt, helfe ich gern weiter. -
Die Funktion "Base64Decode" ist nicht von mir. Die hatte ich irgendwann mal archiviert.
Die PHP-Funktion habe ich Dir mal in AutoIt umgeschrieben:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$string = 'ByJG+vcfheXXp0poGT3hdPKtcgg='
ConsoleWrite($string & @CR)
$string = Base64Decode($string)
ConsoleWrite(Base16Encode($string) & @CR)Func Base64Decode($s)
[/autoit] [autoit][/autoit] [autoit]
; by Eddy
Local $key = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', _
$t = '', $p = -8, $a = 0, $c, $d, $len = StringLen($s)
For $i = 1 to $len
$c = StringInStr($key, StringMid($s, $i, 1), 1) - 1
If $c < 0 Then ContinueLoop
$a = BitOR(BitShift($a, -6), BitAND($c, 63))
$p = $p + 6
If $p >= 0 Then
$d = BitAND(BitShift($a, $p), 255)
If $c <> 64 Then $t = $t & Chr($d)
$a = BitAND($a, 63)
$p = $p - 8
EndIf
Next
Return $t
EndFunc ;==>Base64DecodeFunc Base16Encode($str)
[/autoit]
Local $aKey = StringSplit('abcdefghijklmnop', '', 2), $char, $ret = ''
For $i = 1 To StringLen($str)
$char = Asc(StringMid($str, $i, 1))
$ret &= $aKey[BitShift(BitAND($char, 0xF0), 4)]
$ret &= $aKey[BitAND($char, 0x0F)]
Next
Return $ret
EndFunc -
Schau Dir mal Zeile 16 an. Ohne den Counter würde die Berechnung nicht funktionieren.
Und da es hier ja nur einen Timer gibt (der immer weiter läuft) muss die Abfrage über diese Berechnung geschehen. -
Statt mehrerer Timer kann man auch einfach mit einem einzigen Timer arbeiten.
Ich habe Dir mal ein Beispiel geschrieben (mit entsprechenden Kommentaren):Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Global $iTimer = TimerInit(), $iTimerDiff = 0; das folgende Array $aFunktions ist ein 2D-Array mit jeweils 3 Werten:
[/autoit] [autoit][/autoit] [autoit]
; 1. Wert = die aufzurufene Funktion,
; 2. Wert = Wann die Funktion aufgerufen werden soll (in Millisekunden)
; 3. Wert = Wird als Counter benutzt (wie oft die Funktion aufgerufen wurde)
Global $aFunktions[3][3] = [['_VPNStatus', 5000, 1], ['_CheckDrives', 20000, 1], ['_SendToNSA', 60000, 1]]HotKeySet('{ESC}', '_Exit') ; <- um das Programm beenden zu können
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite('!> Programm gestartet!' & @CR)
[/autoit] [autoit][/autoit] [autoit]While Sleep(250) ; Sleep-Befehl, um den Prozessor zu entlasten. Kann auch auf bis zu 10 ms reduziert werden (je nach Aufrufhäufigkeit der Funktionen)
[/autoit] [autoit][/autoit] [autoit]
$iTimerDiff = TimerDiff($iTimer)
For $i = 0 To UBound($aFunktions) - 1 ; hier werden alle Funktionen aus dem Array überprüft
If $iTimerDiff / $aFunktions[$i][1] > $aFunktions[$i][2] Then ; ist die TimerDifferenz geteilt durch die Millisekunden größer als der Counter, dann...
ConsoleWrite(StringFormat('+> Zeit: %i Sek., Aufruf Nr.: %i, Starte Funktion: "%s"\n', Int($iTimerDiff / 1000), $aFunktions[$i][2], $aFunktions[$i][0]))
$aFunktions[$i][2] += 1 ; den Counter erhöhen
Call($aFunktions[$i][0]) ; und die Funktion aufrufen
EndIf
Next
WEndFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
If MsgBox(4, 'Timer', 'Programm wirklich beenden?') = 7 Then Return
ConsoleWrite('!> Programm beendet!' & @CR)
Exit
EndFunc ;==>_ExitFunc _VPNStatus()
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('-> Funktion VPNStatus ausgeführt!' & @CR)
EndFunc ;==>_VPNStatusFunc _CheckDrives()
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('-> Funktion _CheckDrives ausgeführt!' & @CR)
EndFunc ;==>_CheckDrivesFunc _SendToNSA()
[/autoit]
ConsoleWrite('-> Funktion _SendToNSA ausgeführt! ;-)' & @CR)
EndFunc ;==>_SendToNSA -
BugFix : Interessante Lösung, aber eigentlich zu aufwendig. Dann kann ich das gleich mit den StringFunktionen auseinandernehmen.
Andy: Das ist zwar nicht ganz, was ich will, aber die Werte kann ich dann mit StringSplit trennen.
[autoit]
Vorne noch eine Klammer um die Buchstaben (die brauche ich auch):'(\w+)((?:\|\d*){20})\|.+?\R'
[/autoit]
So reicht mir das dann schon. Danke, für eure Hilfe! -
Ich brauche mal eure Hilfe bei einem RegExp-Problem. Und zwar möchte ich eine Gruppe in dem Pattern wiederholen, aber ich weiß nicht, wie ich das hinkriege.
Hier mal das Beispielscript (auskommentiert, wie es gehen würde, aber das muss doch auch einfacher möglich sein):Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
$sInput = 'aaa|41|63|43|70|58|52|||||||||||||||3|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
$sInput &= 'bbb|||||||||||||||||||||2|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
$sInput &= 'ccc|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|1|0|327|54.500|1|7.50|7.50|aaa' & @CRLF; das gibt mir nur den ersten Wert aus. Ich brauche aber zusätzlich die ersten 20 Werte nach den Buchstaben
[/autoit] [autoit][/autoit] [autoit]
$aOut = StringRegExp($sInput, '(\w+)\|(\d*?)\|.+?\R', 3); das folgende würde vom Ergebnis passen, aber geht das nicht einfacher?
[/autoit] [autoit][/autoit] [autoit]
;~ $aOut = StringRegExp($sInput, '(\w+)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|.+?\R', 3)_ArrayDisplay($aOut)
[/autoit] -
[verschoben nach H&U]
Zum erstellen von Seriennummern hatte ich mal vor langer Zeit ein Script geschrieben, das außerdem gleich verhindert, dass doppelte Nummern generiert werden.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Crypt.au3>
$iTimer = TimerInit()
_GenSerials(10000, @ScriptDir & '\_Nummern.txt', @ScriptDir & '\_MD5Checksummen.txt')
If @error Then MsgBox(0, 'Fehler aufgetreten!', 'Fehlernummer: ' & @error)
ConsoleWrite(TimerDiff($iTimer) & @CR)#cs
[/autoit]
======================================================================================================================
Function Name: _GenSerials($iCount, $sSerialFile, $sMD5File)
Description: Seriennummern nach folgendem Muster "AAAA-BBBB-CCCC-DDDD-EEEE" generieren (keine Doppelten)
Parameter(s): $iCount = Anzahl der Seriennummern
$sSerialFile = Datei, in der die Seriennummern gespeichert werden
$sMD5File = Datei, in der die MD5-Hashwerte gespeichert werden
Author(s): Oscar (http://www.autoit.de)
======================================================================================================================
#ce
Func _GenSerials($iCount, $sSerialFile, $sMD5File)
If $iCount < 1 Or Not IsNumber($iCount) Then Return SetError(1, 0, 0)
Local $hFile1 = FileOpen($sSerialFile, 2)
Local $hFile2 = FileOpen($sMD5File, 2)
Local $sChars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' ; I und 1 sowie O und 0 weggelassen, wegen Verwechslungsgefahr
Local $iCharCount = StringLen($sChars)
Local $oDictionary = ObjCreate('Scripting.Dictionary') ; zum Vergleich auf Doppelte (ist viel schneller als StringInStr)
If $hFile1 <> -1 And $hFile2 <> -1 Then
Local $sSerialOut = '', $sMD5Out = '', $iTimer = TimerInit()
For $i = 1 To $iCount
If TimerDiff($iTimer) > 250 Then
$iTimer = TimerInit()
ToolTip('Generiere Seriennummer: ' & $i, @DesktopWidth/2-100, 0)
EndIf
Do
Local $sTmp = ''
For $j = 1 To 20
$sTmp &= StringMid($sChars, Random(1, $iCharCount, 1), 1)
If $j/4 = Int($j/4) And $j < 20 Then $sTmp &= '-'
Next
Until Not $oDictionary.Exists($sTmp)
$oDictionary.Add($sTmp, 0)
$sSerialOut &= $sTmp & @CRLF
$sMD5Out &= _Crypt_HashData($sTmp, $CALG_MD5) & @CRLF
Next
FileWrite($hFile1, StringTrimRight($sSerialOut, 2))
FileClose($hFile1)
FileWrite($hFile2, StringTrimRight($sMD5Out, 2))
FileClose($hFile2)
Return 1
Else
Return SetError(2, 0, 0)
EndIf
EndFunc -
FileOpen benötigt ein gesetztes Bit 4 (Wert = 16), um im BinärModus zu schreiben.
-
Na dann: Herzlichen Glückwunsch nachträglich!

-
Musst Du das Programm denn unbedingt mit ProcessClose beenden?
Funktioniert WinClose nicht? -
Du kannst die Arrays nicht einfach mit "&" verketten. Das funktioniert nur mit Strings.
Ich verstehe aber auch nicht, warum Du das nicht gleich mit StringRegExpReplace machst.
Beispiel:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>$Form1 = GUICreate("Form1", 440, 256, 422, 225)
[/autoit] [autoit][/autoit] [autoit]
$btnDatei = GUICtrlCreateButton("Textdatei generieren", 216, 152, 123, 41)
GUISetState(@SW_SHOW)$Text = "Suche1Hans MüllerEnde1,Suche2HauptstrasseEnde2,Suche366554Ende3,Suche4HamelnEnde4"; hier kommen die Ergebnisse her!
[/autoit] [autoit][/autoit] [autoit]$Adresse = StringRegExpReplace($Text, 'Suche1(.*?)Ende1,Suche2(.*?)Ende2,Suche3(.*?)Ende3,Suche4(.*?)Ende4', '$1;$2;$3;$4')
[/autoit] [autoit][/autoit] [autoit]
$datei = "test.txt"While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
ExitCase $btnDatei
[/autoit] [autoit][/autoit] [autoit]
FileWrite($datei, $Adresse & @CRLF) ;in Datei schreiben
ShellExecute($datei)EndSwitch
[/autoit]
WEnd -
Bitte das Script posten! Ansonsten kann das niemand nachvollziehen.
-
Schau Dir mal _Timer_GetIdleTime an.
Wenn der zurückgegebene Wert den Wert des Screenblankers überschreitet, dann kannst Du die Programme beenden.
Ist der Wert kleiner, startest Du die Programme. -
In der Hilfe zu "_GUICtrlListView_Create" steht ein Beispiel. Daraus kann man sich etwas passendes basteln:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>Global $g_hListView
[/autoit] [autoit][/autoit] [autoit]Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
[/autoit] [autoit][/autoit] [autoit]
Local $hGUI, $hImage
$hGUI = GUICreate("(UDF Created) ListView Create", 400, 300)$g_hListView = _GUICtrlListView_Create($hGUI, "", 2, 2, 394, 268)
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_SetExtendedListViewStyle($g_hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
GUISetState(@SW_SHOW)GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
[/autoit] [autoit][/autoit] [autoit]; Load images
[/autoit] [autoit][/autoit] [autoit]
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($g_hListView, $hImage, 1); Add columns
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_InsertColumn($g_hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($g_hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($g_hListView, 2, "Column 3", 100); Add items
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_AddItem($g_hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($g_hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($g_hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($g_hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($g_hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($g_hListView, "Row 3: Col 1", 2); Loop until the user exits.
[/autoit] [autoit][/autoit] [autoit]
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>ExampleFunc WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $hWnd, $iMsg, $wParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
; Local $tBuffer
$hWndListView = $g_hListView
If Not IsHWnd($g_hListView) Then $hWndListView = GUICtrlGetHandle($g_hListView)$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
[/autoit]
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $iIndex = DllStructGetData($tInfo, "Index")
Local $iSubItem = DllStructGetData($tInfo, "SubItem")
MsgBox(0, 'RMB', 'Index: ' & $iIndex & @CR & 'SubItem: ' & $iSubItem)
Return 0 ; allow the default processing
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY