Jump to content

Powershell GUI


Direkt zur Lösung Gelöst von EmmKay,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Leute,

 

vielleicht kann mir hier jemand weiter helfen bzw. einen besseren Code vorschlagen. Vielen Dank im Voraus

 

Ich habe/möchte eine Powershell GUI mit functions erstellen, jedoch weiß ich nicht wie ich Beispielsweise ein Label ein/ausblenden kann (Siehe letzten 15 Zeilen im Code)

Hier mein derzeitiger Code:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$Windowname = "Script"
$xmax = "300"                                                #Am besten mit STRG+H alle Zahlen von "300" auf die gewünschte Größe ersetzen
$ymax = "450"                                                #Am besten mit STRG+H alle Zahlen von "450" auf die gewünschte Größe ersetzen

function Button{
    param(
    [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey,
    [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable,
    [parameter(Mandatory=$true)][ValidateSet("OK", "Cancel", "None")]$Result,
    [AllowEmptyString()][ValidateSet($true, $false)]$AddClick,
    [AllowEmptyString()]$Click
    )

    $ButtonName = "Button" + $Name
    $ButtonName = New-Object System.Windows.Forms.Button
    $ButtonName.Location = New-Object System.Drawing.Point($posx,$posy)
    $ButtonName.Size = New-Object System.Drawing.Size($Sizex,$Sizey)
    $ButtonName.Text = $Name
    $ButtonName.DialogResult = $Result
    if($AddClick -eq $true){
        $ButtonName.add_click({
        $Click
        })
    }
    if($Visable -eq $true){$form.Controls.Add($ButtonName)}
}

function Label{
    param(
    [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey,
    [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable,
    [AllowEmptyString()] $Text
    )

    $LabelName = "Label" + $Name
    $LabelName = New-Object System.Windows.Forms.Label
    $LabelName.Location = New-Object System.Drawing.Point($posx,$posy)
    $LabelName.Size = New-Object System.Drawing.Size($Sizex,$Sizey)
    $LabelName.Text = $Text
    if($Visable -eq $true){$form.Controls.Add($LabelName)}
}

function Box{
    param(
    [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey,
    [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable,
    [parameter(Mandatory=$true)][ValidateSet("List", "Text", "Search")]$Version,
    [AllowEmptyString()] $input,
    [AllowEmptyString()] $Text
    )

    if($Version -eq "List"){
        $ListBoxName = "ListBox" + $Name
        $ListBoxName = New-Object System.Windows.Forms.ListBox
        $ListBoxName.Location = New-Object System.Drawing.Point($posx,$posy)
        $ListBoxName.Size = New-Object System.Drawing.Size($Sizex,$Sizey)
        $ListBoxName.SelectionMode = 'MultiExtended'
        foreach ($i in $input){[void] $ListBoxName.Items.Add($i)}
        $listBox.Height = $Sizey
        $form.Topmost = $true
        if($Visable -eq $true){$form.Controls.Add($ListBoxName)}
    }elseif($Version -eq "Text"){
        $TextBoxName = "TextBox" + $Name
        $TextBoxName = New-Object System.Windows.Forms.TextBox
        $TextBoxName.Location = New-Object System.Drawing.Point($posx,$posy)
        $TextBoxName.Size = New-Object System.Drawing.Size($Sizex,$Sizey)
        $form.Topmost = $true
        if($Visable -eq $true){$form.Controls.Add($TextBoxName)}
    }
}

$form = New-Object System.Windows.Forms.Form
$form.Text = $Windowname
$form.Size = New-Object System.Drawing.Size($xmax,$ymax)
$form.StartPosition = 'CenterScreen'

Button -Name "OK" -posx "75" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result OK
Button -Name "Cancel" -posx "150" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result Cancel
Button -Name "NoPrinter" -posx "10" -posy "305" -Sizex "260" -Sizey "23" -Visable True -Result None -AddClick True -Click "$form.Controls.Add(Text2)"

Label -Name "Text1" -posx "10" -posy "10" -Sizex "280" -Sizey "30" -Visable True -Text 'Wähle die Drucker aus
(Mit "STRG" können mehrere ausgewählt werden)'
Label -Name "Text2" -posx "10" -posy "330" -Sizex "280" -Sizey "30" -Visable False -Text 'Gib den vollständigen Druckernamen ein:'

Box -Name "Text" -posx "10" -posy "350" -Sizex "260" -Sizey "20" -Visable True -Version Text

$result = $form.ShowDialog()

 

bearbeitet von Lukasb14
Link zu diesem Kommentar
vor 12 Minuten schrieb Sunny61:

Schau doch mal in diesen Thread: https://stackoverflow.com/questions/56640925/creating-a-label-which-disappears-after-a-few-seconds

 

$label.Visible = $false

 

Du hast Visable geschrieben, ersetz das doch mal mit *visible*. ;)

Hallo dies ist nur eine Variable die übergeben wird sollte also egal sein wie diese geschrieben wird, habs trotzdem mal geändert und hab das selbe Thema ;)

Außerdem ist sie auch sichtbar wenn ich sie auf true setze, möchte aber nicht dass sie von anfang an angezeigt wird.

Wie im Code ersichtlich möchte ich mit einem Klick auf dem Button "NoPrinter", dass das Label mit dem Namen "Text2" sichtbar wird. Weiß allerdings nicht wie ich herausfinde wie ich genau dieses Label sichtbar mache. Folgendes funktioniert leider nicht:

$form.Controls.Add(Text2)
Link zu diesem Kommentar

Nur der Vollständigkeit halber ... 

 

vor 10 Minuten schrieb Sunny61:

Du meinst also es ist egal ob Du -Visable oder -Visible schreibst? OK, dann viel Erfolg weiterhin. :)

 

 

Wenn das ein selbst gewählter Variablen- oder Parameter-Name ist, ist es tatsächlich egal. Man muss es dann eben nur konsistent so benutzen und kann nicht einmal -Visible und ein anderes mal -Visable nutzen..

Link zu diesem Kommentar
vor einer Stunde schrieb BOfH_666:

Wenn das ein selbst gewählter Variablen- oder Parameter-Name ist, ist es tatsächlich egal.

 

vor 7 Stunden schrieb Lukasb14:
    [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable,

That said - das könnte auch $Apfelbutzen oder $Trashbin heißen :-) Ich würde zwar statt dem ValidateSet einfach ein [Bool] davorsetzen, aber das ist pure Kosmetik.

Link zu diesem Kommentar

Hallo, danke für die ganzen Vorschläge, jedoch geht es mir nicht um den Prameter. Da ich hier "function" verwende, kann ich einen speziellen Button oder ein Label im weiteren Code nicht mehr aufrufen um es der Form hinzuzufügen oder zu entfernen.

ZB möchte ich in folgender Zeile bei einem Klick auf den Button "NoPrinter" das Label mit dem "Text2" anzeigen lassen.

Button -Name "NoPrinter" -posx "10" -posy "305" -Sizex "260" -Sizey "23" -Visable True -Result None -AddClick True -Click "$form.Controls.Add(Text2)"

Wie kann ich herausfinden welches Label den "Text2" hat 

Alle Labels werden vereinfacht gesagt so erstellt:

function Label{
$LabelName = New-Object System.Windows.Forms.Label
}

Ein "Get-Object System.Windows.Form.Label" gibt es anscheinend nicht :(

Link zu diesem Kommentar

Du könntest ein globales (Script-Scope) Array erstellen, in dem Du [PSCustomObject]@{} speicherst, die alle von Dir benötigten Objekte enthalten. Das kannst Du in Where-Object pipen mit $_.Name -eq 'Text2'.

Oder Du erstellst ein globales [PSCustomObject]{}, dem Du jedes Label als Member hinzufügst, dann kannst Du mit $Object.LabelName direkt auf alle seine Eigenschaften zugreifen: $Object.Text2.posx oder so :-) Hier gibt es leider zu viele Wege nach Rom...

Link zu diesem Kommentar
vor 16 Stunden schrieb daabm:

Du könntest ein globales (Script-Scope) Array erstellen, in dem Du [PSCustomObject]@{} speicherst, die alle von Dir benötigten Objekte enthalten. Das kannst Du in Where-Object pipen mit $_.Name -eq 'Text2'.

Oder Du erstellst ein globales [PSCustomObject]{}, dem Du jedes Label als Member hinzufügst, dann kannst Du mit $Object.LabelName direkt auf alle seine Eigenschaften zugreifen: $Object.Text2.posx oder so :-) Hier gibt es leider zu viele Wege nach Rom...

Danke für die Hilfe leider hab ich noch eher wenig mit PSCustomObject gearbeitet, habe nun folgendes gemacht

function Button{
    param(
    [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey,
    [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable,
    [parameter(Mandatory=$true)][ValidateSet("OK", "Cancel", "None")]$Result,
    [AllowEmptyString()][ValidateSet($true, $false)]$AddClick,
    [AllowEmptyString()]$Click
    )

    $ButtonName = New-Object System.Windows.Forms.Button
    $ButtonName.Name = "Button$Name"
    $ButtonName.Location = New-Object System.Drawing.Point($posx,$posy)
    $ButtonName.Size = New-Object System.Drawing.Size($Sizex,$Sizey)
    $ButtonName.Text = $Name
    $ButtonName.DialogResult = $Result
    if($AddClick -eq $true){
        $ButtonName.add_click({
        $Click
        })
    }
    if($Visable -eq $true){$form.Controls.Add($ButtonName)}

    [PSCustomObject]@{
        Name = $ButtonName.Name
        Location = $ButtonName.Location 
        Size = $ButtonName.Size 
        Text = $ButtonName.Text 
        DialogResult = $ButtonName.DialogResult 
        add_click = $ButtonName.add_click
    }

}
Button -Name "OK" -posx "75" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result OK
Button -Name "Cancel" -posx "150" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result Cancel
Button -Name "NoPrinter" -posx "10" -posy "305" -Sizex "260" -Sizey "23" -Visable True -Result None -AddClick True -Click "$form.Controls.Remove([PSCustomObject]'ButtonOK')"

Kannst mir vielleicht nochmal helfen, wie ich das PSCustomObject mit dem Namen "ButtonOK" abrufe.

Link zu diesem Kommentar
Am 22.6.2022 um 11:12 schrieb Lukasb14:

Ich habe/möchte eine Powershell GUI mit functions erstellen, jedoch weiß ich nicht wie ich Beispielsweise ein Label ein/ausblenden kann (Siehe letzten 15 Zeilen im Code)

Alle Steuerelement erben von der [System.Windows.Forms.Control]-Klasse die Visible-Eigenschaft. Mit Hilfe dieser Eigenschaften lassen sich Deine Labels ein- und ausblenden. Control.Visible Eigenschaft

 

Ich würde das Steuerelement von der Funktionen zurückgeben lassen und einer Variable zuweisen. Alle Steuerelement würde ich auch grundsätzlich dem Formular hinzufügen Die Sichtbarkeit des Steuerelements steuerst Du ja über die Visible-Eigenschaft.

 

Damit das Click-Ereignis funktioniert, muss Du dem Ereignis ein Scriptblock übergeben.

 

Leicht angepasster Code

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$Windowname = "Script"
$xmax = "300"                                                #Am besten mit STRG+H alle Zahlen von "300" auf die gewünschte Größe ersetzen
$ymax = "450"                                                #Am besten mit STRG+H alle Zahlen von "450" auf die gewünschte Größe ersetzen

function Button{
    param(
    [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $PosX,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $PosY,
    [parameter(Mandatory=$true)][ValidateRange(0,300)] $SizeX,
    [parameter(Mandatory=$true)][ValidateRange(0,450)] $SizeY,
    [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visible,
    [parameter(Mandatory=$true)][ValidateSet("OK", "Cancel", "None")]$Result,
    [AllowEmptyString()][ValidateSet($true, $false)]$AddClick,
    [AllowEmptyString()]$Click
    )

    $ButtonName = "Button" + $Name
    $ButtonName = New-Object System.Windows.Forms.Button
    $ButtonName.Location = New-Object System.Drawing.Point($posx,$posy)
    $ButtonName.Size = New-Object System.Drawing.Size($Sizex,$Sizey)
    $ButtonName.Text = $Name
    $ButtonName.DialogResult = $Result
    if($AddClick -eq $true){
        $ButtonName.add_click(
        $Click
        )
    }

    $ButtonName.Visible = $Visible

    $ButtonName
}


$form = New-Object System.Windows.Forms.Form
$form.Text = $Windowname
$form.Size = New-Object System.Drawing.Size($xmax,$ymax)
$form.StartPosition = 'CenterScreen'

$OKButton = Button -Name "OK" -PosX 75 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result OK
$CancelButton = Button -Name "Cancel" -PosX 150 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result Cancel
$NoPrtButton = Button -Name "NoPrinter" -PosX 10 -PosY 305 -SizeX 260 -SizeY 23 -Visible $True -Result None -AddClick True -Click {[System.Windows.Forms.Messagebox]::Show("Hello")}

$form.Controls.Add($OKButton)
$form.Controls.Add($CancelButton)
$form.Controls.Add($NoPrtButton)

$result = $form.ShowDialog()

 

 

 

 

bearbeitet von EmmKay
Link zu diesem Kommentar
  • Beste Lösung

Noch nicht perfekt ....

 

Zitat
Add-Type -AssemblyName System.Windows.Forms, System.Drawing

$FormName = "Script"
$MaxX     = "300"                                                #Am besten mit STRG+H alle Zahlen von "300" auf die gewünschte Größe ersetzen
$MaxY     = "450"                                                #Am besten mit STRG+H alle Zahlen von "450" auf die gewünschte Größe ersetzen

function Add-Button {
    param(
        [parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Name,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,300)]
        [System.Int32]
        $PosX,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,450)]
        [System.Int32]
        $Posy,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,300)]
        [System.Int32]
        $SizeX,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,450)]
        [System.Int32]
        $SizeY,
        [parameter(Mandatory=$true)]
        [ValidateSet($true, $false)]
        [System.Boolean]
        $Visible,
        [parameter(Mandatory=$true)]
        [ValidateSet("OK", "Cancel", "None")]
        [System.Windows.Forms.DialogResult]
        $Result,
        # [AllowEmptyString()]
        # [ValidateSet($true, $false)]
        # [System.Boolean]
        # $AddClickEventHandler,
        [AllowEmptyString()]
        [System.Management.Automation.ScriptBlock]
        $ClickEventHandler
    )

    $newButton              = New-Object System.Windows.Forms.Button
    $newButton.Name         = "Button$Name"
    $newButton.Location     = New-Object System.Drawing.Point($PosX, $PosY)
    $newButton.Size         = New-Object System.Drawing.Size($SizeX, $SizeY)
    $newButton.Text         = $Name
    $newButton.DialogResult = $Result
    $newButton.Visible      = $Visible

    # if ($AddClickEventHandler) {
        $newButton.Add_Click($ClickEventHandler)
    # }

    $newButton
}

function Add-Label {
    param(
        [parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Name,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,300)]
        [System.Int32]
        $PosX,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,450)]
        [System.Int32]
        $PosY,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,300)]
        [System.Int32]
        $SizeX,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,450)]
        [System.Int32]
        $SizeY,
        [parameter(Mandatory=$true)]
        [ValidateSet($true, $false)]
        [System.Boolean]
        $Visible,
        [AllowEmptyString()]
        $Text
    )

    $newLabel          = New-Object System.Windows.Forms.Label
    $newLabel.Name     = "Label$Name"
    $newLabel.Location = New-Object System.Drawing.Point($PosX, $PosY)
    $newLabel.Size     = New-Object System.Drawing.Size($SizeX, $SizeY)
    $newLabel.Text     = $Text
    $newLabel.Visible  = $Visible

    $newLabel
}

function Add-Box{
    param(
        [parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Name,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,300)]
        [System.Int32]
        $PosX,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,450)]
        [System.Int32]
        $PosY,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,300)]
        [System.Int32]
        $SizeX,
        [parameter(Mandatory=$true)]
        [ValidateRange(0,450)]
        [System.Int32]
        $SizeY,
        [parameter(Mandatory=$true)]
        [ValidateSet($true, $false)]
        [System.Boolean]
        $Visible,
        [parameter(Mandatory=$true)]
        [ValidateSet("List", "Text", "Search")]
        [System.String]
        $ControlType,
        [AllowEmptyString()]
        [System.String]
        $Entries, # $Input <- automatische PS-Variable
        [AllowEmptyString()]
        [System.String]
        $Text = ""
    )

    if($ControlType -eq "List") {
        $newControl               = New-Object System.Windows.Forms.ListBox
        $newControl.Name          = "ListBox$Name"
        $newControl.SelectionMode = 'MultiExtended'
        $newControl.Height        = $SizeY

        foreach($Entry in $Entries) {
            [void]$newControl.Items.Add($Entry)
        }
    } elseif ($ControlType -eq "Text") {
        $newControl      = New-Object System.Windows.Forms.TextBox
        $newControl.Name = "TextBox$Name"
        $newControl.Text = $Text
    }

    $newControl.Location = New-Object System.Drawing.Point($PosX, $Posy)
    $newControl.Size     = New-Object System.Drawing.Size($SizeX, $SizeY)
    $newControl.Visible  = $Visible

    $newControl
}

$form               = New-Object System.Windows.Forms.Form
$form.Text          = $FormName
$form.Size          = New-Object System.Drawing.Size($MaxX, $MaxY)
$form.StartPosition = 'CenterScreen'
$form.Topmost       = $True

$OKButton     = Add-Button -Name "OK" -PosX 75 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result OK
$CancelButton = Add-Button -Name "Cancel" -PosX 150 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result Cancel
$NoPrtButton  = Add-Button -Name "NoPrinter" -PosX 10 -PosY 305 -SizeX 260 -SizeY 23 -Visible $True -Result None -ClickEventHandler { $label2.Visible = $True }

$label1 = Add-Label -Name "Text1" -PosX 10 -PosY 10 -SizeX 280 -SizeY 30 -Visible $True -Text 'Wähle die Drucker aus
(Mit "STRG" können mehrere ausgewählt werden)'
$label2 = Add-Label -Name "Text2" -PosX 10 -PosY 330 -SizeX 280 -SizeY 30 -Visible $False -Text 'Gib den vollständigen Druckernamen ein:'

$text = Add-Box -Name "Text" -PosX 10 -PosY 350 -SizeX 260 -SizeY 20 -Visible $True -ControlType Text

$form.Controls.Add($OKButton)
$form.Controls.Add($CancelButton)
$form.Controls.Add($NoPrtButton)
$form.Controls.Add($label1)
$form.Controls.Add($label2)
$form.Controls.Add($text)

$result = $form.ShowDialog()

 

 

 

image.png.40b90b1ce89de39628538be7d4adbe38.png

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...