Jump to content

Powershell GUI


Go to solution Solved by EmmKay,

Recommended Posts

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()

 

Edited by Lukasb14
Link to comment
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 to comment

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 to comment
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.

  • Haha 1
Link to comment

Me culpa, es ist ein selbst erstellter Variablenname, zumindest sehe ich das so in Zeile:

 

if($Visable -eq $true){$form.Controls.Add($ButtonName)}

 

Ich bin auf Visable/Visible reingefallen. Apfelbutzen oder Trashbin wären Namen gewesen, die mir nicht so ins Auge gefallen wären, wie Visable. ;)

  • Thanks 1
Link to comment

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 to comment

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 to comment
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 to comment
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()

 

 

 

 

Edited by EmmKay
Link to comment
  • Solution

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 to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...