Ich glaube, ich habe jetzt eine recht gute Lösung gefunden. Ich hab mir gedacht, es wird geprüft, ob der String richtig ist. Wenn nicht wird das zuletzt eingegebene Zeichen entfernt. Dadurch funktioniert es bei mir jetzt perfekt. Egal, wo der Cursor sich befindet, etc. . Dadurch wird noch optimiert, dass nicht mehrere Kommas erlaubt sind (s. Oscar).
Auf die idee kam ich durch die Cursorposition bei Oscar
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>
$hGui = GUICreate('Test')
$cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
$hInput = GUICtrlGetHandle($cInput)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
Do
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
Until 0
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $iIDFrom, $hWndEdit, $sRead, $iCode
$iIDFrom = BitAND($iwParam, 0xFFFF)
$iCode = BitShift($iwParam, 16)
$hWndEdit = GUICtrlGetHandle($iIDFrom)
If $hWndEdit = $hInput And $iCode = $EN_CHANGE Then
$sRead = GUICtrlRead($iIDFrom)
If Not StringRegExp($sRead, '^\d+,?(\d+)?$') Then
$iCurrentCol = ControlCommand($hGui, '', $cInput, 'GetCurrentCol', '')
$sReadL=StringMid($sRead,1,$iCurrentCol-2)
$sReadR=StringMid($sRead,$iCurrentCol)
GUICtrlSetData($iIDFrom, $sReadL&$sReadR)
_SendMessage(GUICtrlGetHandle($iIDFrom), $EM_SETSEL, $iCurrentCol-2, $iCurrentCol-2)
EndIf
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND