hallo zusammen,
ein kleines Testprogramm um die Maus vordefiniert zu bewegen innerhalb eines festgelegten raums in der GUI. Es funktioniert so, dass wenn die Checkbox gecheckt wird, dann beginnt der Mauszeiger den vorgegebenen lauf. Dies kann dann unabhängig von dem Ort wo das Fenster ist gemacht werden und der Positionsablauf ist immer identisch. Super!
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
Global $Window = GUICreate("mouse - mouseing it!", 305, 185, -1, -1)
Global $File = GUICtrlCreateMenu("File")
Global $StartFile = GUICtrlCreateMenuItem("Start Mouse", $File)
Global $StopFile = GUICtrlCreateMenuItem("Stop Mouse", $File)
Global $ExitFile = GUICtrlCreateMenuItem("Exit Mouse", $File)
Global $Help = GUICtrlCreateMenu("Help")
Global $Info = GUICtrlCreateMenuItem("Infobox", $Help)
Global $About = GUICtrlCreateMenuItem("About", $Help)
Global $Mousefield = GUICtrlCreateGroup("Mousefield", 128, 16, 161, 121)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $StartCheck = GUICtrlCreateCheckbox("Start Mouse", 24, 32, 81, 17)
Global $Stop = GUICtrlCreateButton("Reset/Stop", 16, 80, 95, 25)
Global $ExitBut = GUICtrlCreateButton("EXIT", 16, 112, 95, 25)
GUISetState(@SW_SHOW)
Global $dancing = False
Global $step = 0
Global $positions[4][2] = [[15, 15], [118, 15], [118, 90], [15, 90]] ; Relative Positionen in der GUI
Global $lastMoveTime = TimerInit()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $ExitBut, $ExitFile
Exit
Case $StartCheck
If GUICtrlRead($StartCheck) = 1 Then
$dancing = True
$step = 0 ; Reset dance
$lastMoveTime = TimerInit()
EndIf
Case $StartFile
GUICtrlSetState($StartCheck, $GUI_CHECKED)
If GUICtrlRead($StartCheck) = 1 Then
$dancing = True
$step = 0 ; Reset dance
$lastMoveTime = TimerInit()
EndIf
Case $Stop, $StopFile
$dancing = False
GUICtrlSetState($StartCheck, $GUI_UNCHECKED)
EndSwitch
; Aktiviere die tanzende Maus nur wenn Checkbox gecheckt ist
If $dancing Then
If TimerDiff($lastMoveTime) > 5000 Then
; Hole Koordianten vom der linken oberen Ecke des GUI-Fensters
Local $windowPos = WinGetPos($Window)
Local $windowX = $windowPos[0]
Local $windowY = $windowPos[1]
; Definiere die Bewegungsposition innerhalb des Fensters(Mousefield)
Local $fieldX = 140 ; X position relativ zum GUI-Fenster
Local $fieldY = 65 ; Y position relativ zum GUI-Fenster
Local $fieldWidth = 161 ; Breite von Mousefield
Local $fieldHeight = 121 ; Hoehe of Mousefield
; Berechne nun die neue Positionen
Local $xPos = $positions[$step][0] + $fieldX + $windowX
Local $yPos = $positions[$step][1] + $fieldY + $windowY
; Stelle sicher das die relative Abhaengigkeit gewaehrleistet bleibt.
If $xPos < $windowX + $fieldX Then $xPos = $windowX + $fieldX
If $yPos < $windowY + $fieldY Then $yPos = $windowY + $fieldY
If $xPos > $windowX + $fieldX + $fieldWidth Then $xPos = $windowX + $fieldX + $fieldWidth
If $yPos > $windowY + $fieldY + $fieldHeight Then $yPos = $windowY + $fieldY + $fieldHeight
; Setze den Mauszeiger an die berechnete Stelle
MouseMove($xPos, $yPos, 10)
$step += 1
If $step >= UBound($positions) Then $step = 0
$lastMoveTime = TimerInit()
EndIf
EndIf
WEnd
Alles anzeigen
leider ist dies nur solange gut, wie das fenster nicht minimiert wird. wird es minimiert, dann spingt der mauszeiger beim naechsten intervall an die linke obere ecke des bildschirms und bleibt dort ohne weiterhin seinen bewegungsablauf zu machen. ... was ich machen moechte: wenn ich das fenster bewege wird ja immer relativ zu der oberen linken ecke der GUI der abstand fuer den ablauf so berechnet, dass die relative position immer die gleiche ist zu der stelle wo sich die GUI befindet. ... nun wenn ich das program starte, dann bewege und dann minimiere moechte ich im prinzip, dass der mauszeiger an der stelle wo das fenster zuletzt war einfach weitermacht trotz minimiertem status. solange bis ich das GUI-fenster wieder hervorrufe um es zu stoppen oder zu schliessen. geht das?
ein ansatz den ich versucht hatte, war mit einer funktion, aber die lief leider ins leere. hat vielleicht jemand eine zuendende idee hierzu?
gruss und dank im voraus