Schau dir mal diese Funktionen an:
[autoit]PixelGetColor()
PixelSearch()
MouseMove()
MouseClick()
Schau dir mal diese Funktionen an:
[autoit]PixelGetColor()
PixelSearch()
MouseMove()
MouseClick()
Ich hab an eine Checksum gedacht, basierend auf 2er Potenzen, aber die kommen auch öfter vor.
Das geht recht gut - wenn auch nicht unbegrenzt ![]()
; Muster Checkbox-Bearbeitung
; Ziel: einfache Abfrage, welche CB aktiviert sind
#include <GUIConstants.au3>
Opt('GUIOnEventMode', 1)
Opt("MustDeclareVars", 1)
Global $bCheckAll, $bUnCheckAll, $GUI, $i, $str
Global $arCB[20][2] ; Array für Handle und Dual-Wert der CB
For $i = 0 To UBound($arCB) -1
$arCB[$i][1] = 2^$i ; Zuweisung eindeutiger Wert
Next
Global $Checked = 0 ; Variable nimmt Status ALLER Checkboxen in einem Wert auf,
; Startstatus für alle: UNCHECKED
Global $w = 500, $h = 20*30+40, $l = (@DesktopWidth-$w)/2, $t = (@DesktopHeight-$h)/2
Global $top = -10
$GUI = GUICreate('Test Checkbox', $w, $h, $l, $t)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Ende')
For $i = 0 To UBound($arCB) -1
$top += 30
$arCB[$i][0] = GUICtrlCreateCheckbox('CheckBox_' & $i+1, 40, $top, 120)
GUICtrlSetOnEvent(-1, '_ClickCB')
Next
$bCheckAll = GUICtrlCreateButton('Alle markieren', 250, 20, 150, 21)
GUICtrlSetOnEvent(-1, '_CheckAll')
$bUnCheckAll = GUICtrlCreateButton('Markierung aufheben', 250, 50, 150, 21)
GUICtrlSetOnEvent(-1, '_UnCheckAll')
GUISetState()
While 1
Sleep(100)
WEnd
Func _Ende()
Exit
EndFunc
Func _ClickCB()
For $i = 0 To UBound($arCB) -1
If $arCB[$i][0] = @GUI_CtrlId Then
$Checked = BitXOR($Checked, $arCB[$i][1])
_ReadCB()
ExitLoop
EndIf
Next
EndFunc
Func _CheckAll()
For $i = 0 To UBound($arCB) -1
If Not BitAND($Checked, $arCB[$i][1]) Then
GUICtrlSetState($arCB[$i][0], $GUI_CHECKED)
$Checked = BitXOR($Checked, $arCB[$i][1])
EndIf
Next
_ReadCB()
EndFunc
Func _UnCheckAll()
For $i = 0 To UBound($arCB) -1
If BitAND($Checked, $arCB[$i][1]) Then
GUICtrlSetState($arCB[$i][0], $GUI_UNCHECKED)
$Checked = BitXOR($Checked, $arCB[$i][1])
EndIf
Next
_ReadCB()
EndFunc
Func _ReadCB() ; Fkt. dient nur zur Ausgabe, welche CB markiert sind
Local $str = 'Markiert: '
For $i = 0 To UBound($arCB) -1
If BitAND($Checked, $arCB[$i][1]) Then $str &= $i+1 & ', '
Next
WinSetTitle($GUI, '', StringTrimRight($str, 2))
EndFunc
die Einträge wie in einer Tabelle darstellen kann.
Na dann verwende doch die Tabellendarstellung ==> ListView ist dafür ideal.
So wie ich das sehe, willst du irgendwo Daten auslesen und diese auf der GUI darstellen. Warum verwendest du keine Liste oder ListView?
Aber was ist, wenn ich jetzt eine Funktion hat, die Parameter braucht? Geht das auch über SetOnEvent?
So meinte ich das
Geht auch. Du weist z.B. mehreren Button dieselbe Funktion zu. In Abhängigkeit des gedrückten Buttons rufst du von dort eine Funktion mit Parameter auf:
; Button-Funktion
Func _ButtonClicked()
Switch @GUI_CtrlHandle
Case $Button1
_Button('Bla')
Case $Button2
_Button('Blabla')
Case $Button3
_Button('Blub')
EndSwitch
EndFunc
Func _Button($Parameter)
; der Code, zb.:
GUICtrlSetData($ctrl, $Parameter)
EndFunc
Wenn das ganze jetzt über einen Button ausgelöst werden soll, geht das glaube ich (Achtung: Halbwissen :)) nicht über die Event-Mode, sondern nur über den Messageloop-Modus (wenn falsch: Bitte klärt mich auf :))
Achtung: Aufklärung! ![]()
Das geht selbstredend sowohl im GUIGetMsg- als auch im OnEventMode
.
Unterschied: Im Event-Mode wird bei Erstellung des Ctrl ein Funktion zugeordnet (GUICtrlSetOnEvent), die durch ein Event dieses Ctrl aktiviert wird. Im GUIGetMsg-Mode wird ständig die GUI abgefragt, ob und welches Ctrl denn gerade ein Event ausgelöst hat. Die entsprechende ID wird dann weiterverarbeitet.
Es geht darum ein Script zu schrieben womit ich eine Installationsprotokoll erstellen kann.
Füge doch hinter jede Codezeile, die du loggen willst einfach ein: _FileWriteLog("Datei", Text)
Die Angaben, die von der Funktion verarbeitet werden sollen, werden im Funktionsaufruf als Parameter übergeben. Dazu werden in der Funktion entsprechende Platzhalter deklariert. Eine Funktion sollte entweder einen Ergebniswert zurückgeben oder einen Wert für Erfolg(1 bzw. >0)/Mißerfolg(0)
[autoit]; Bsp. 1
Func _Addieren($Param_1, $Param_2)
Return $Param_1 + $Param_2
EndFunc
; Anwendung:
$Summe = _Addieren(120, 70)
$Summe = _Addieren(10, 200)
; Bsp. 2
#include <File.au3>
Func _Log($LOGFILE, $TEXT)
Return _FileWriteLog($LOGFILE, $TEXT)
EndFunc
; Anwendung:
_Log(@ScriptDir & '\Event.log', 'Programm Start')
_Log(@ScriptDir & '\Event.log', 'Error blabla')
Du kannst dazu $WM_COMMAND nutzen.
Wie du es verwendest, findest du in der Hilfe zu GUIRegisterMsg().
Zitat von AutoItHilfeThere are a few parts of AutoIt that don't yet have full Unicode support. These are:
Send and ControlSend - Instead, Use ControlSetText or the Clipboard functions.
Regular expressions - To reduce the size of AutoIt, the regular expression engine is currently compiled in ANSI mode.
Console operations are converted to ANSI.
These limits will be addressed in future versions if possible.
Du brauchst keine einzelnen Variablen um die ausgelesenen Werte zuzuordnen, verwende ein Array:
[autoit]; ganze Datei in Array einlesen
Dim $arDatei
_FileReadToArray("Dateipfad", $arDatei)
; entweder trennst du die noch zusammenhängenden Werte vorab auf, oder direkt beim Zugriff
; vorab:
ReDim $arDatei[UBound($arDatei)][2]
Local $var
For $i = 1 To UBound($arDatei) -1
$var = StringSplit($arDatei[$i][0], ',')
$arDatei[$i][0] = $var[1]
$arDatei[$i][1] = $var[2]
Next
; direkt beim Zugriff wäre analog, nur ohne Schleife und statt $i der entsprechende Zeilenindex
[/autoit]Dazu 2 Antworten ![]()
1. Ja, es ist möglich. Aber da diese Anwendung dann problemlos als Keylogger mißbraucht werden könnte, werden wir hier im Forum den Code nicht posten. Ich hoffe, dafür hast du Verständnis.
2. Lass doch den User mittels einer kleinen GUI den Hotkey festlegen:
- Listbox mit allen Tasten
- User wählt Taste, per Button wird diese zum HotKeystring zugefügt (Anzeige in einem Label)
- User wählt nächste Taste... usw.
- zum Schluß Übernahme Hotkey und Funktionszuweisung
BugFix : Wieso ist das nicht so einfach?? Über den OnEventMode geht das doch, oder
Wenn du z.B. gerade in einer Schleife etwas abarbeitest, kann kein Ereignis des Buttons wirksam werden. Der Klick auf den Button wird dann im Tastaturpuffer aufgefangen und erst, wenn die Schleife beendet ist, kann das Ereignis verarbeitet werden. Da ist es völlig egal, ob OnEventMode oder GUIGetMsg.
Ich hab das noch nie versucht, aber es dürfte eigentlich am leichtesten über eine GUI gehen. Eine MessageBox ist ja nur für eine Nachricht da. Dort muss man ja bestätigen...
Benutzt Koda, dann geht das sehr schnell
Ganz so einfach geht das nicht ![]()
Echtes Multitasking ist nicht möglich. Du kannst was mit AdlibEnable basteln um kontinuierlich zu ermitteln, ob abgebrochen werden soll. Die Standard-MessageBox kannst du da aber nicht verwenden.
Deine Funktion Titeltestzeit($Name) ruft NaechsterTitel($Name) auf. So wie ich das sehe, wird aber kein neuer Wert an $Name übergeben - also wird die Funktion mit dem letzten Wert aufgerufen ==> dein Titel beginnt von vorn.
Du deklarierst hier:
[autoit]$Anzahl = $Anzahl - 1
[/autoit][autoit][/autoit][autoit]Global $Stein[$Anzahl], $Formel[$Anzahl], ;...usw.
[/autoit]Somit haben die Array $Anzahl Elemente. Nimm als Bsp. 5: Bei der Adressierung startest du mit [0], das letzte Element ist also [4] ($Anzahl -1).
Aber, wenn dass schon am Anfang des Scriptes fest steht (3xRadios) ?
Am Ergebnis ändert sich nichts, dauert nur !
Ist eine Sache der Gewöhnung. Es empfiehlt sich immer UBound($array)-1 zu verwenden, da dann garantiert alle Elemente erfaßt werden. Es kann ja durchaus passieren, dass man eine 'Eingebung' hat und noch ein Radio mehr verwendet, wird jetzt vergessen den Zähler hochzusetzen gibt es einen Fehler. Mit UBound ist halt jede mögliche Veränderung abgesichert. ![]()
d.h. ich kann dem Setup-Programm nachträgliche Einträge in der .ini nichtmehr mitteilen.
Du brauchst dem Programm nur mitteilen, dass eine INI vorhanden ist (bzw., dass wenn eine da ist - If FileExists($INI) - diese eingelesen und verarbeitet wird.
IniReadSection() liest dir alle Schlüssel-Wert-Paare einer Sektion in ein Array ein - und dieses arbeitest du einfach ab.
Kannst du jederzeit beliebig erweitern.
$var = IniReadSection($INI, 'section')
For $i = 1 To $var[0][0]
$var[$i][0] ; Key
$var[$i][1] ; Value
; dein Code zum abarbeiten
Next
So,
hab dir mal die Rekursion reingebaut:
#include <file.au3>
#include "_Array2DEmptyDel.au3"
Local $folder, $filesinpath, $aFile
$folder = "c:\admin_V8\config\project_config\users\"
$filesinpath = _GetFilesFolder_Rekursiv($folder, 'ucf', 0)
If $filesinpath[0] = 0 Then Exit MsgBox(262192,"Achtung!","Der gewählte Ordner enthält keine Dateien!")
For $i = 1 To UBound($filesinpath) -1
If Not _FileReadToArray($filesinpath[$i], $aFile) Then ContinueLoop
For $k = 1 To UBound($aFile) -1
If StringRegExp($aFile[$k], '(MS_)(MDL(APPS)?|DGNAPPS)') Then $aFile[$k] = ''
Next
_Array2DEmptyDel($aFile)
_FileWriteFromArray($filesinpath[$i], $aFile, 1)
Next
;==================================================================================================
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Rekursive Auflistung von Dateien und/oder Ordnern
; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
; optional: $iRetType 0 gibt Array, 1 gibt String zurück
; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
Global $oFSO = ObjCreate('Scripting.FileSystemObject')
Global $strFiles = ''
Switch $sDelim
Case '1'
$sDelim = @CR
Case '2'
$sDelim = @LF
Case '3'
$sDelim = ';'
Case '4'
$sDelim = '|'
Case Else
$sDelim = @CRLF
EndSwitch
If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
If $sExt = -1 Then $sExt = '*'
If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
_ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
If $iRetType = 0 Then
Local $aOut
$aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
If $aOut[1] = '' Then
ReDim $aOut[1]
$aOut[0] = 0
EndIf
Return $aOut
Else
Return StringTrimRight($strFiles, StringLen($sDelim))
EndIf
EndFunc
Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
If Not IsDeclared("strFiles") Then Global $strFiles = ''
If ($Dir = -1) Or ($Dir = 0) Then
For $file In $Folder.Files
If $Ext <> '*' Then
If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
$strFiles &= $file.Path & $Delim
Else
$strFiles &= $file.Path & $Delim
EndIf
Next
EndIf
For $Subfolder In $Folder.SubFolders
If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
_ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
Next
EndFunc
Kann ich nicht nachvollziehen.
Man was ist das Windows doch für 'ne tolle Sache: Du hast eines, ich hab eines - aber trotzdem macht jedes was es will. ![]()