- Offizieller Beitrag
Wenn mit absoluten Koordinaten gearbeitet wird, und ich die Position über einem Fenster prüfen muss, brauche ich zwingend die Randbreiten des Fensters, da das Fenster auf dem Monitor dargestellt wird mit:
- gewählte X-Koordinate + Randbreite Seite (+ gewählte Fensterbreite + Randbreite Seite)
- gewählte Y-Koordinate + Randbreite Oben (+ gewählte Fensterhöhe + Randbreite Unten = Seite)
Diese Werte sind bei unterschiedlichen Windows-Styles auch unterschiedlich. Mit _WinAPI_GetSystemMetrics kann man alle Einzelkomponenten der Randbreite abfragen. Ich hab das mal in einen Aufruf gepackt.
Man übergibt zwei Variablen für oberen Rand und Seitenrand, diese werden dann beim Aufruf befüllt.
Spoiler anzeigen
$hGui = GUICreate('Test')
GUICtrlCreateLabel('Rand oben:', 10, 23, 60, 17)
$inTop = GUICtrlCreateInput('', 70, 20, 40, 20)
GUICtrlCreateLabel('Rand Seite:', 10, 53, 60, 17)
$inSide = GUICtrlCreateInput('', 70, 50, 40, 20)
$bt = GUICtrlCreateButton('Auslesen', 10, 100, 60, 20)
GUISetState()
Local $iTop, $iSide
[/autoit] [autoit][/autoit] [autoit]While 1
Switch GUIGetMsg()
Case -3
Exit
Case $bt
_SystemGetWindowBorder($iTop, $iSide)
GUICtrlSetData($inTop, $iTop)
GUICtrlSetData($inSide, $iSide)
EndSwitch
WEnd
Func _SystemGetWindowBorder(ByRef $_iTopBorder, ByRef $_iSideBorder)
; == by BugFix
Local Const $SM_CYCAPTION = 4, $SM_CYEDGE = 46, $SM_CYBORDER = 6, $SM_CXBORDER = 5, $SM_CXEDGE = 45
Local $aMetrics[5][2] = [[$SM_CYCAPTION], [$SM_CYEDGE], [$SM_CYBORDER], [$SM_CXBORDER], [$SM_CXEDGE]]
Local $dll = DllOpen("user32.dll"), $aRet
For $i = 0 To 4
$aRet = DllCall($dll, "int", "GetSystemMetrics", "int", $aMetrics[$i][0])
If IsArray($aRet) Then $aMetrics[$i][1] = $aRet[0]
Next
DllClose($dll)
$_iTopBorder = $aMetrics[0][1] + $aMetrics[1][1] + $aMetrics[2][1]
$_iSideBorder = $aMetrics[3][1] + $aMetrics[4][1]
EndFunc