#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("MustDeclareVars", 0) ; Option:Variablen müssen deklariert werden? ( 1 = Ja | 0 = Nein ).
Dim $iCounter = 0, $MainGuiDelay = 0, $MainGuiQuantity = 0 ; Variablen vordeklariert, weil diese aus .INI ausgelesen werden.

#region Variablen der 'MainGUI'
Dim $MainGuiWidth = 300 ; Bestimmt die Fensterbreite
Dim $MainGuiHeight = 220 ; Bestimmt die Fensterhöhe
Dim $XMainGuiPOS = @DesktopWidth / 2 - $MainGuiWidth / 2 ; Bestimmt die X-Position des Fensters. Durch die Formel ist es mittig vom Bildschirm
Dim $YMainGuiPOS = @DesktopHeight / 2 - $MainGuiHeight / 2 ; Bestimmt die Y-Position des Fensters. Durch die Formel ist es mittig vom Bildschirm
#endregion Variablen der 'MainGUI'

#region Variablen der 'OptionGUI'
Dim $OptionGuiWidth = 392 ; Bestimmt die Fensterbreite
Dim $OptionGuiHeight = 138 ; Bestimmt die Fensterhöhe
Dim $XOptionGuiPOS = @DesktopWidth / 2 - $MainGuiWidth / 2 ; Bestimmt die X-Position des Fensters. Durch die Formel ist es mittig vom Bildschirm
Dim $YOptionGuiPOS = @DesktopHeight / 2 - $MainGuiHeight / 2 ; Bestimmt die Y-Position des Fensters. Durch die Formel ist es mittig vom Bildschirm
#endregion Variablen der 'OptionGUI'

If FileExists(@ScriptDir & "\Resources\Options.ini") Then ; Frägt ab, ob die 'Options.ini' vorhanden ist, da diese benötigt wird.
	_MainGUI() ; Wenn die 'Options.ini' vorhanden ist, wird man zu 'MainGUI' verwiesen...
Else
	_ErstEinstellung() ; ... andernfalls läuft man die Ersteinstellung durch, um die später benötigte 'Options.ini' zu erzeugen.
EndIf ;==> FileExists zu 'Options.ini'

Func _MainGUI() ; Beinhaltet die 'MainGUI' und die Hauptschleife.
	$MainGUI = GUICreate("Koordinator", $MainGuiWidth, $MainGuiHeight, $XMainGuiPOS, $YMainGuiPOS)
	$MainGuiLabIinf = GUICtrlCreateLabel("Dies ist ein Hilfsprogramm zum erfassen von mehreren Mauspositionen. Wenn sie den Start-Knopf drücken, startet die Erfassung mit den letzten Einstellungen.", 20, 20, 260, 40, 0x0000)
	$MainGuiBtnStart = GUICtrlCreateButton("Start", 113, 80, 75, 25)
	$MainGuiBtnOption = GUICtrlCreateButton("Optionen", 113, 125, 75, 25)
	$MainGuiBtnAbort = GUICtrlCreateButton("Abbrechen", 113, 170, 75, 25)
	GUISetState(@SW_SHOW)

	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				Exit
			Case $MainGuiBtnStart
				$MainGuiQuantity = IniRead(@ScriptDir & "\Resources\Options.ini", "Optionen", "Anzahl", "") ; Anzahl der Wiederholungen aus 'Options.ini' auslesen.
				$MainGuiDelay = IniRead(@ScriptDir & "\Resources\Options.ini", "Optionen", "Verzögerung", "") ; Verzögerung zwischen den Positionserfassungen aus 'Options.ini' auslesen.
				GUISetState(@SW_HIDE) ; 'MainGUI' ausblenden
				$MainGuiDelay = $MainGuiDelay * 1000 ; Die Verzögerung wird von Sekunden in Millisekunden umgewandelt / umgerechnet.
				_Erfassung() ; Die eigentliche Funktion zur Erfassung starten.
			Case $MainGuiBtnOption
				GUISetState(@SW_HIDE) ; 'MainGUI' ausblenden
				_OptionGUI() ; Funktion der Einstellungen aufrufen
			Case $MainGuiBtnAbort
				Exit
		EndSwitch
	WEnd
EndFunc   ;==>_MainGUI

Func _OptionGUI() ; Fenster für die Einstellungen des Programms.
	$OptionGUI = GUICreate("Optionen", $OptionGuiWidth, $OptionGuiHeight, $XOptionGuiPOS, $YOptionGuiPOS)
	$OptionGuiLabQuantity = GUICtrlCreateLabel("Anzahl der zu erfassenden Mauspositionen:", 16, 19, 209, 17)
	$OptionGuiLabDelay = GUICtrlCreateLabel("Zeitabstand zwischen den einzelnen Erfassungen:", 16, 59, 241, 17)
	$OptionGuiInQuantity = GUICtrlCreateInput("", 304, 16, 65, 21)
	$OptionGuiInDelay = GUICtrlCreateInput("Sekunden", 304, 56, 65, 21)
	$OptionGuiBtnOkay = GUICtrlCreateButton("Okay", 80, 96, 75, 25)
	$OptionGuiBtnAbort = GUICtrlCreateButton("Abbrechen", 240, 96, 75, 25)
	GUISetState(@SW_SHOW)

	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				Exit

			Case $OptionGuiBtnOkay
				$OptionGuiQuantity = GUICtrlRead($OptionGuiInQuantity) ; Lies die eingegebene Anzahl der Wiederholungen aus.
				$OptionGuiDelay = GUICtrlRead($OptionGuiInDelay) ; Lies die eingegebene Verzögerung der Erfassungen aus.
				IniWrite(@ScriptDir & "\Resources\Options.ini", "Optionen", "Anzahl", $OptionGuiQuantity) ; Schreibt die Anzahl der Wiederholungen in die 'Options.ini'.
				IniWrite(@ScriptDir & "\Resources\Options.ini", "Optionen", "Verzögerung", $OptionGuiDelay) ; Schreibt die Verzögerung der Erfassungen in die 'Options.ini'.
				GUISetState(@SW_HIDE) ; 'OptionGUI' ausblenden und...
				_MainGUI() ; ... zur 'MainGUI' wechseln / zurückkehren.
			Case $OptionGuiBtnAbort
				GUISetState(@SW_HIDE)
				If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
				$iMsgBoxAnswer = MsgBox(52, "Sicher?", "Ein Abbruch hätte aus Sicherheitsgründen das Beenden des" & @CRLF & "Programms zu folge!" & @CRLF & @CRLF & "Sind Sie sicher, dass Sie die Einstellungen abbrechen wollen?")
				; >> Es wird per MsgBox abefragt, ob man sich sicher ist, dass Programm zu beenden. Durch das Auslesen des Return kann das Programm 'reagieren'.
				Select
					Case $iMsgBoxAnswer = 6 ; Ja -> schließen.
						Exit
					Case $iMsgBoxAnswer = 7 ; Nein -> zur GUI-Funktion '_OptionGui' zurückspringen.
						_OptionGui()
				EndSelect
		EndSwitch
	WEnd

EndFunc   ;==>_OptionGUI

Func _Erfassung() ; Die eigentliche Erfassung der Mauspositionen.
	FileDelete(@ScriptDir & "\Log.ini") ; Falls eine 'Log.ini' vorhanden ist, wird diese gelöscht. Dies geschieht, damit bei einem niedriegem Zähler nicht noch alte Werte vorhanden wären.
	While $iCounter <> $MainGuiQuantity ; Der Zähler wird mit der Gesamtzahl der Durchgänge verglichen.
		$iCounter += 1 ; Dient der Auflistung der Positionen in der 'Log.ini' und der While-Schleife.
		Sleep($MainGuiDelay) ; Verzögert, damit man die Maus an die nächste Position bewegen kann.
		$MousePos = MouseGetPos() ; Schreibt die aktuelle Mausposition in ein Array
		IniWrite(@ScriptDir & "\Log.ini", $iCounter & ". Erfassung", "X-Position", " " & $MousePos[0]) ; Schreibt die X-Position der Maus mit dem Zähler in die 'Log.ini'. " " dient dazu, dass man die Koordinate per Doppelklick makieren kann.
		IniWrite(@ScriptDir & "\Log.ini", $iCounter & ". Erfassung", "Y-Position", " " & $MousePos[1]) ; Schreibt die Y-Position der Maus mit dem Zähler in die 'Log.ini'. " " dient dazu, dass man die Koordinate per Doppelklick makieren kann.
		MsgBox(0, $iCounter & ".Position", "Position erfasst!") ; Gibt eine kurze Rückmeldung, dass eine Position erfasst wurde. Kann mit Leertaste / Entertaste bestätigt werden.
	WEnd
	MsgBox(0, "Fertig!", "Die angegebene Anzahl an Erfassungen wurde erreicht!") ; Gibt eine kurze Rückmeldung, dass die festgelegte Anzahl an Erfassungen erreicht wurde
	Exit
EndFunc   ;==>_Erfassung

Func _ErstEinstellung() ; Funktion zum ersten Einstellen des Programms
	If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
	$iMsgBoxAnswer = MsgBox(65, "Erste Verwendung", "Ich habe festgestellt, dass dies Ihre erste Verwendung vom" & @CRLF & "Koordinator ist. Aus diesem Grund öffne ich Ihnen erstmal das" & @CRLF & "'Optionen'-Fenster damit Sie die Einstellungen festlegen können." & @CRLF & @CRLF & "Durch betätigen des 'Abbrechen'-Buttons können Sie das Programm" & @CRLF & "beenden." & @CRLF & @CRLF & "MfG," & @CRLF & "          Wolf-XIII")
	; >> Es wird per MsgBox mitgeteilt, dass zum ersten Programmstart die Einstellungen festgelegt werden müssen.
	Select
		Case $iMsgBoxAnswer = 1 ; OK
			DirCreate(@ScriptDir & "\Resources")
			_OptionGui() ; Verweist auf die GUI zum Festlegen der Einstellung.
		Case $iMsgBoxAnswer = 2 ; Abbruch
			Exit
	EndSelect

EndFunc   ;==>_ErstEinstellung