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-Key: 1241999776

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

Printed on: May 9, 2024 at 13:05 o'clock

Member: Tezzla
Tezzla Sep 09, 2021 at 08:22:12 (UTC)
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
Member: em-pie
em-pie Sep 09, 2021 at 08:28:55 (UTC)
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
Member: gfritz74
gfritz74 Sep 09, 2021 at 08:31:15 (UTC)
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.
Member: colinardo
colinardo Sep 09, 2021, updated at Oct 03, 2021 at 10:47:22 (UTC)
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
Member: TK1987
Solution TK1987 Sep 09, 2021 updated at 09:08:22 (UTC)
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
Member: Tezzla
Tezzla Sep 09, 2021 at 08:49:05 (UTC)
Goto Top
Man lernt nie aus face-smile
Member: gfritz74
gfritz74 Sep 09, 2021 at 08:52:00 (UTC)
Goto Top
Hey prima vielen vielen Dank.
Das werde ich beides mal umsetzen.