gfritz74
Goto Top

Powershell Userform nicht über den Bildschirmrand hinaus verschiebbar machen

Guten Morgen zusammen,

ich habe mir eine Userform erstellt in welchem ein Timer läuft.
Klappt auch alles gut.
Die einzige Falle über die ich stolpere ist das das User form nicht über den Bildschirmrand hinaus verschiebbar sein darf.
hat einer von Euch vielleicht ne Idee wie ich das lösen kann so das es direkt im Skript mit drin steht.
Ein Beispiel würde mir reichen.

Viele Grüße und Danke schonmal.

gfritz74

Content-ID: 1241999776

Url: https://administrator.de/contentid/1241999776

Ausgedruckt am: 25.11.2024 um 16:11 Uhr

Tezzla
Tezzla 09.09.2021 um 10:22:12 Uhr
Goto Top
Moin,

soweit ich weiß kann man zwar die Startposition vorgeben, aber nicht, wieweit man das Fenster verschieben kann.
Was möglich ist, mit der GUI ein AutoHotKey Script zu starten, was die Fensterposition deines Forms dauerhaft überprüft und bei bedarf wieder zum Start oder vom Rand weg schiebt.

VG
em-pie
em-pie 09.09.2021 um 10:28:55 Uhr
Goto Top
Moin,

ich vermute auch mal, dass es nicht mit Standardmitteln möglich ist.

Was aber wohl möglih wäre:
Prüfe die Position und größe des Fensters.
In der GUI dann nach folgender Logik vorgehen
Wenn Startposition + Breite der GUI > DisplayResolution.Breite
 Start.X = Displayresolution - Breite der GUI

Wenn Startposition + Höhe der GUI > DisplayResolution.Höhe
 Start.Y = Displayresolution - Höhe der GUI

oder so ähnlich

Gruß
em-pie
gfritz74
gfritz74 09.09.2021 um 10:31:15 Uhr
Goto Top
Erstmal Danke für die Antworten.
Habe auch nichts gefunden. Werde mich dann mal an die Idee von em-pie setzen.
Danke Euch und einen schönen Tag noch.
colinardo
colinardo 09.09.2021, aktualisiert am 03.10.2021 um 12:47:22 Uhr
Goto Top
Servus,
einfaches Beispiel
Add-Type -A System.Windows.Forms
$global:screen = $null
$form = New-Object System.Windows.Forms.Form -Property  @{
    Size = '500,500'  
    Location = '100,100'  
    StartPosition = 'Manual'  
    Text = "Demo"  
}

$form.add_Shown({
    $global:screen = [System.Windows.Forms.Screen]::FromControl($form)
})

$form.add_LocationChanged({
    if ($this.Location.X -lt $global:screen.WorkingArea.X){$this.Left = $global:screen.WorkingArea.X}
    if ($this.Location.Y -lt $global:screen.WorkingArea.Y){$this.Top = $global:screen.WorkingArea.X}
    if (($this.Location.X + $this.Width) -gt $global:screen.WorkingArea.Width){
        $this.Left = $global:screen.WorkingArea.Width - $this.Width
    }
    if (($this.Location.Y + $this.Height) -gt $global:screen.WorkingArea.Height){
        $this.Top = $global:screen.WorkingArea.Height - $this.Height
    }
})

[void]$form.ShowDialog()
Grüße Uwe
TK1987
Lösung TK1987 09.09.2021 aktualisiert um 11:08:22 Uhr
Goto Top
Moin,

Zitat von @gfritz74:
Die einzige Falle über die ich stolpere ist das das User form nicht über den Bildschirmrand hinaus verschiebbar sein darf.
über die Events ließe sich das Ganze schon regeln - allerdings kannst du das Fenster dann auch nicht mehr auf einen anderen Monitor schieben, falls mehrere Monitore angeschlossen sind
Add-Type -a System.Windows.Forms

# Bildschirmgröße ermitteln
$Screen = [Windows.Forms.Screen]::PrimaryScreen.WorkingArea | Select Width,Height

# Fenster erstellen
$Form = New-Object Windows.Forms.Form -Property @{
  MaximumSize = $Screen
}

# Position auf Bildschirm begrenzen
$Form.Add_LocationChanged({
  switch ($this.Location) {
    {$_.X -lt 0}                                  { $this.Left = 0 }
    {$_.Y -lt 0}                                  { $this.Top  = 0 }
    {($_.X+$this.Size.Width)  -gt $Screen.Width}  { $this.Left = $Screen.Width - $this.Size.Width }
    {($_.Y+$this.Size.Height) -gt $Screen.Height} { $this.Top  = $Screen.Height-$this.Size.Height }
  }
})

Gruß Thomas
Tezzla
Tezzla 09.09.2021 um 10:49:05 Uhr
Goto Top
Man lernt nie aus face-smile
gfritz74
gfritz74 09.09.2021 um 10:52:00 Uhr
Goto Top
Hey prima vielen vielen Dank.
Das werde ich beides mal umsetzen.