Hallo,
weiß jemand wie man eine GUI so machen kann, dass es sich automatisch am Bildschirmrand andockt?
Also das es sozusagen, wenn es 5 Pixel vom Bildschirmrand entfernt ist "angezogen" wird.
Hallo,
weiß jemand wie man eine GUI so machen kann, dass es sich automatisch am Bildschirmrand andockt?
Also das es sozusagen, wenn es 5 Pixel vom Bildschirmrand entfernt ist "angezogen" wird.
Guck das mal an: DockIt
Das hab ich schon gesehen, aber das ist nicht das, was ich suche. Also mein GUI soll sich nur am Bildschirmrad (oben + unten + rechts + links + Tray) andockbar sein. Jetzt weiß ich nun nicht genau wie man sowas bewerkstelligen soll. :-/
Hab ich verstanden und dieses Skript zeigt doch den Weg. Nur dass du als Andockkriterium die Desktopränder benötigst.
Versuch mal dein Glück und melde dich, wenn es nicht swird.
Sry hab ich dann falsch verstanden :wacko: . Dein Script ist mir leider viel zu kompliziert (soviele Arrays usw...) .
Deswegen hab ich es so versucht:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
$Width = 200
$Hight = 200
$Toleranz = 100
$hwnd = GUICreate("Dock mich an :D", $Width, $Hight)
GUISetState()
While 1
If GUIGetMsg() = -3 Then Exit
$Pos = WinGetPos($hwnd)
[/autoit] [autoit][/autoit] [autoit]If $Pos[0] < $Toleranz Then WinMove($hwnd, "", 0, $Pos[1])
If $Pos[1] < $Toleranz Then WinMove($hwnd, "", $Pos[0], 0)
Sleep(1)
WEnd
Dies klappt gut soweit, aber ich möchte meinen Gui auch rechts und unten andocken. Weiß jetzt nicht wie ich es machen soll. Ich habs mit @DesktopWidth ausprobiert, aber da ist nichts gescheites herausgekommen.
Hier mal eine Komplettlösung:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Global $CatchWidth = 70 ; Pixelbereich indem das Fenster gefangen wird
Global $BorderDiff = 5 ; Pixelabstand zum Rand
Global $gui = GUICreate("Dock on Border", 300, 300)
GUISetState(@SW_SHOW, $gui)
; WM_MOVE registrieren:
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
While True
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd
Func WM_MOVE($hWndGUI)
If Not(WinGetHandle($gui) = $hWndGUI) Then Return $GUI_RUNDEFMSG
Local $aPos = WinGetPos($gui)
Local $Catch_Left = $CatchWidth, $Catch_Right = @DesktopWidth - $CatchWidth
Local $Catch_Top = $CatchWidth, $Catch_Bottom = @DesktopHeight - $CatchWidth
Select
Case $aPos[0] <= $Catch_Left
If $aPos[1] <= $Catch_Top Then
WinMove($gui, '', $BorderDiff, $BorderDiff)
ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
Else
WinMove($gui, '', $BorderDiff, $aPos[1])
EndIf
Case $aPos[0] + $aPos[2] >= $Catch_Right
If $aPos[1] <= $Catch_Top Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
Else
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $aPos[1])
EndIf
Case $aPos[1] <= $Catch_Top
If $aPos[0] <= $Catch_Left Then
WinMove($gui, '', $BorderDiff, $BorderDiff)
ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
Else
WinMove($gui, '', $aPos[0], $BorderDiff)
EndIf
Case $aPos[1] + $aPos[3] >= $Catch_Bottom
If $aPos[0] <= $Catch_Left Then
WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
Else
WinMove($gui, '', $aPos[0], @DesktopHeight - $BorderDiff - $aPos[3])
EndIf
EndSelect
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_MOVE
Edit: Hatte nen kleine Bug bei Top drin - gefixt.