@Jeka:
letzter Post: [ Sonntag, 23. Mai 2010, 16:07 ] <== Leichenschändung ![]()
Beiträge von BugFix
-
-
Hatte ich mal ein Bsp. für gemacht, kannst es ja dann anpassen (zum nächsten Feld mit ENTER):
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1)
OnAutoItExitRegister('OnAutoItExit')Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
[/autoit] [autoit][/autoit] [autoit]
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
Global $active = False, $gui, $ID_lastFocus = 0
Enum $i1, $i2, $c1, $i3, $c2, $i4, $n ; <== hier die Reihenfolge, wie der Fokus 'wandern' soll ($n ist Zähler für Anz. Ctrl)
Global $a[$n]$gui = GUICreate('')
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent(-3, '_ende')
$a[$i1] = GUICtrlCreateInput('', 10,10,40)
$a[$i2] = GUICtrlCreateInput('', 60,10,40)
$a[$c1] = GUICtrlCreateCombo('', 110,10,40)
$a[$i3] = GUICtrlCreateInput('', 160,10,40)
$a[$c2] = GUICtrlCreateCombo('', 210,10,40)
$a[$i4] = GUICtrlCreateInput('', 260,10,40)
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit]
If BitAND(WinGetState($gui),
Then
$active = True
Else
$active = False
EndIf
Sleep(100)
WEndFunc _ende()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc;===========================================================
[/autoit] [autoit][/autoit] [autoit]
; callback function
;===========================================================
Func _KeyProc($nCode, $wParam, $lParam)
Local $tKEYHOOKS, $vkCode, $ID, $index
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Or Not $active Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
$vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
If $wParam = $WM_KEYDOWN And $vkCode = 13 Then ; ENTER gedrückt
$ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($gui, '', ControlGetFocus($gui)))
; Für ComboBoxen kann NICHT der Fokus abgefragt werden, da dieser auf dem Input-Ctrl der ComboBox liegt.
; Hier muß in der Instanz-Reihenfolge mit dem Wert des letzten Ctrl verglichen werden.
; Die Reihenfolge der Erstellung in der GUI ist egal, da der Fokus über die enumerierte Reihenfolge der Ctrl-Variablen
; weitergesetzt wird.
; Falls eine ComboBox als letztes Ctrl in der Folge erscheint, muß dies in der Abfragelogik berücksichtigt werden.
If _WinAPI_GetClassName($ID) <> 'Edit' Then
; Variante 1: über Class+Instance
$ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($gui, "", "[CLASS:ComboBox; INSTANCE:1]"))
If $ID_lastFocus > $ID Then $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($gui, "", "[CLASS:ComboBox; INSTANCE:2]"))
; Variante 2: über Enumerations-Reihenfolge der ComboCtrls
;~ $ID = $a[$c1]
;~ If $ID_lastFocus > $ID Then $ID = $a[$c2]
EndIf
$index = _ArraySearch($a, $ID)
If @error Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
If $index < UBound($a)-1 Then
GUICtrlSetState($a[$index +1], $GUI_FOCUS)
$ID_lastFocus = $a[$index +1]
Else
GUICtrlSetState($a[0], $GUI_FOCUS)
$ID_lastFocus = $a[0]
EndIf
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFuncFunc OnAutoItExit()
[/autoit]
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_KeyProc)
EndFunc
Edit: Hier die Variante "direkt weiter":Spoiler anzeigen
[autoit]#include <EditConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)Global $gui
[/autoit] [autoit][/autoit] [autoit]
Enum $i1, $i2, $i3, $i4, $n ; <== hier die Reihenfolge, wie der Fokus 'wandern' soll ($n ist Zähler für Anz. Ctrl)
Global $a[$n]$gui = GUICreate('')
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent(-3, '_ende')
$a[$i1] = GUICtrlCreateInput('', 10,10,40)
$a[$i2] = GUICtrlCreateInput('', 60,10,40)
$a[$i3] = GUICtrlCreateInput('', 160,10,40)
$a[$i4] = GUICtrlCreateInput('', 260,10,40)
GUISetState()ControlFocus($gui, '', $a[$i1])
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')While True
[/autoit] [autoit][/autoit] [autoit]
Sleep(50)
WEndFunc _ende()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFuncFunc WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit, $sRead
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
For $i = 0 To UBound($a) -2
Switch $hWndFrom
Case GUICtrlGetHandle($a[$i])
If $iCode = $EN_CHANGE Then
ControlFocus($gui, '', $a[$i+1])
ExitLoop
EndIf
EndSwitch
Next
Return 0
EndFunc ;==>WM_COMMAND -
Du mußt jede Änderung speichern. Hier mal ein Bsp. wie du es nutzen kannst:
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
OnAutoItExitRegister('_WriteToIni') ; Beim Beenden des Programms wird autmatisch der CB-Status in die INI geschriebenGlobal $INI = @ScriptDir & '\test_CB.ini'
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($INI) Then ; bei erstem Start Erstellen der INI, vorbelegt UNCHECKED
IniWriteSection($INI, 'checkboxes', '1=0' & @LF & '2=0' & @LF & '3=0' & @LF & '4=0')
EndIfLocal $gui, $aCB[4], $y = 10
[/autoit] [autoit][/autoit] [autoit]
Local $aState = IniReadSection($INI, 'checkboxes') ; Status der Checkboxen einlesen$gui = GUICreate('Test')
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To 3
$aCB[$i] = GUICtrlCreateCheckbox('CheckBox ' & $i+1, 10, $y, 80)
If $aState[$i+1][1] = 1 Then
GUICtrlSetState($aCB[$i], $GUI_CHECKED)
Else
GUICtrlSetState($aCB[$i], $GUI_UNCHECKED)
EndIf
$y += 25
NextGUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
If $msg = -3 Then Exit
For $i = 0 To UBound($aCB) -1 ; wenn CB geklickt wird, wird der Status im Array Status geändert
If $msg = $aCB[$i] Then
If BitAND(GUICtrlRead($aCB[$i]), $GUI_CHECKED) Then
$aState[$i+1][1] = 1
Else
$aState[$i+1][1] = 0
EndIf
ExitLoop
EndIf
Next
WEndFunc _WriteToIni() ; beim Beenden von AutoIt Zurückschreiben Status
[/autoit]
IniWriteSection($INI, 'checkboxes', $aState)
EndFunc -
Frohe Nachricht: Gun-Food hat den Fehler ausgemerzt - das Forum läuft wieder. Herzlichen Dank dafür.
-
ich meine den Parameter
Na dann sag das doch gleich
iParam kann nur Integer sein. Außerdem sollte man folgenden (in der AutoIt-Hilfe nicht dokumentierten Zustand) berücksichtigen:
Integer 1 - 1000 in iParam werden vom System verwendet zur Zuordnung von IDs!
Also geh auf Nummer sicher und erhöhe beim Eintragen in iParam deinen Wert um z.B. 2000 und beim Auslesen ziehst du diese dann wieder ab.
Du kannst doch statt der Arraywerte, den Index des Arraywertes eintragen. Damit hast du doch auch direkt Zugriff auf deinen Eintrag. -
Es heiß nicht umsonst: _AddString

Also verpacke deine Zahlen als String: "0.123" -
Verwende folgendes Pattern:
[autoit]$string = StringRegExpReplace($string, "(<.>)([^<]+)(</.>)", "$2")
[/autoit] -
Möchte auch mal meinen Senf dazugeben:
Wenn schon Mathe draufsteht, sollte auch wirklich Mathe drin sein (also kein GUI oder GDI+ -Gedöns).
Als Matheaufgaben, die interessant sind und auch von allen angegangen werden können, würde ich Aufgaben sehen, in denen es darum geht neue/andere Lösungswege zu durchaus auch bekannten Problemen zu entwickeln. Dann liegt das Hauptaugenmerk auf der Logik als A und O der Mathematik.
Also dann viel Spaß dabei.
-
mal ein "X" oder "POQ" stehen kann und ich die Zeichanzahl nicht weiß.
In meinem Beispiel ist es völlig egal, wie lang die Inhalte der beiden Zellen sind. Ich speichere die Länge und formatiere danach die entsprechende Anzahl an Zeichen.
Und für die Farbe,Schriftart etc. kannst du natürlich auch Variablen verwenden, denen du einen entsprechenden Wert zuweist. -
Hast du dran gedacht, dass PixelGetColor absolute Koordinaten verwendet?
-
Spontan mir einfallende Lösung: PixelGetColor()
-
Schau in der Hilfe unter "ObjEvent" - da findest du einen Objekt-Error-Handler.
-
Ich hatte denselben Lösungsweg wie Oscar, auch mal in eine Funktion verpackt. Sollte dir dann einfacher fallen es zu nutzen.
Mit Parameter $array = 1 wird ein Array zurückgegeben.Spoiler anzeigen
[autoit];==============================================================================
[/autoit]
; Gibt eine Anzahl Zufallszahlen ohne Doppel als String oder Array zurück
; Bereich von - bis festlegbar (positiv Integer)
; mit -1 für Anzahl werden alle Zahlen des Bereichs in zufälliger Reihenfolge
; ausgegeben
;==============================================================================
Func _RandomExt($iBis, $iVon=1, $iAnzahl=-1, $array=0)
Local $count = $iBis -$iVon +1
If $iAnzahl = -1 Then $iAnzahl = $count
Local $aValue[$count], $start = $iVon, $sOut = '', $random
For $i = 0 To $count -1
$aValue[$i] = $start
$start += 1
Next
For $i = 0 To $iAnzahl -1
$random = Random(0, $count -1 -$i, 1)
$sOut &= $aValue[$random] & ','
$aValue[$random] = $aValue[$count -1 -$i]
Next
$sOut = StringTrimRight($sOut, 1)
If $array Then Return StringSplit($sOut, ',', 2)
Return $sOut
EndFunc ;==>_RandomExt -
Na siehste, wie einfach es ist, wenn du sagst, was du vor hast.
Maus brauchst du nicht. Du willst dem User ja nur einen Mauszeiger zeigen der bestimmte Dinge tut:
- MauszeigerIcon auf Mini-GUI platzieren, die du transparent machst
- statt echter Maus die Maus-GUI bewegen
- die tatsächlichen Mausklicks kannst du ja mit ControlClick realisieren, da Paint Standard-Windows Ctrl verwendet -
Du machst ja ein riesen Geheimnis draus.
Also du willst die Maus mit Präzision auf dem Monitor rumschubsen und der User soll sie sehen aber nicht selbst eingreifen können?
Da fällt mir nix zu ein.
-
Wie gesagt, die Maus an einer Position halten ist kein Problem, mein Programm muss sie aber verändern können. Lediglich der User soll die MausPos nicht verändern dürfen
Na dann fängst du die Maus mit _MouseTrap an der gewünschten Position und bei Bedarf gibst du sie frei und setzt sie an eine andere Position (MouseMove), wobei ich den Sinn dahinter nicht erkennen kann. Wozu brauchst du die Maus, wenn der User sie nicht benutzen soll? Dann kannst du sie doch einfach ausblenden. -
[autoit]
$status = ControlCommand($sTitle, "", "[CLASS:Button; INSTANCE:1]", "IsChecked", "") ; 1 für Checked
[/autoit] -
Dann probier mal den Aufruf "Rundll32.exe mouse,disable"
-
Fang doch die Maus mit _MouseTrap in einem ganz kleinen Bereich und verstecke den Cursor.
-
Registriere WM-Message "WM_KEYDOWN" und zähle damit.