syntax1001
Goto Top

PowerShell GUI: TextBox Input vorgeben (formatieren)

Hallo zusammen,

ich entwickle gerade ein PS-Script für Windows 10 Client Installationen.
In diesem GUI Script sind TextBoxen enthalten die für die Windows und Office Aktivierung vorgesehen sind. Sprich, in diese TextBoxen will ich stumpf den entsprechenden Key eingeben.

Nun zu meiner Frage:
Kann ich die TextBoxen so konfigurieren, dass
- alle Buchstaben automatisch groß geschrieben werden
- zahlen bleiben zahlen (keine Sonderzeichen)
- Nach jedem 5 Zeichen ein "-" eingefügt wird

Ziel ist es also, dass die TextBox sich genau so verhält wie das Eingabefeld für die Windows Aktivierung in den Systemeinstellungen.
Ich habe im World Wide Web nichts genaues dazu finden können....ist mein Vorhaben vielleicht gar nicht möglich ?

Stand jetzt habe ich nur eine "nackte" TextBox:
# TextBox WinKey
$WINKeyBox                      = New-Object System.Windows.Forms.TextBox
$WINKeyBox.width                = 325
$WINKeyBox.height               = 20
$WINKeyBox.location             = New-Object System.Drawing.Point(15,200)
$WINKeyBox.Font                 = New-Object System.Drawing.Font('Microsoft Sans Serif',10)  

Im voraus bereits vielen Dank für eure Mühen!

Content-ID: 1366662580

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

Ausgedruckt am: 26.11.2024 um 03:11 Uhr

mbehrens
mbehrens 08.10.2021 um 13:51:43 Uhr
Goto Top
Zitat von @SYNTAX1001:

ich entwickle gerade ein PS-Script für Windows 10 Client Installationen.
In diesem GUI Script sind TextBoxen enthalten die für die Windows und Office Aktivierung vorgesehen sind. Sprich, in diese TextBoxen will ich stumpf den entsprechenden Key eingeben.

Nun zu meiner Frage:
Kann ich die TextBoxen so konfigurieren, dass
- alle Buchstaben automatisch groß geschrieben werden
- zahlen bleiben zahlen (keine Sonderzeichen)
- Nach jedem 5 Zeichen ein "-" eingefügt wird

Ziel ist es also, dass die TextBox sich genau so verhält wie das Eingabefeld für die Windows Aktivierung in den Systemeinstellungen.
Ich habe im World Wide Web nichts genaues dazu finden können....ist mein Vorhaben vielleicht gar nicht möglich

Die Implementierung eines passenden Event Handlers, z. B. für TextChanged, könnte helfen.
colinardo
Lösung colinardo 08.10.2021 aktualisiert um 17:31:43 Uhr
Goto Top
Servus @SYNTAX1001,
habe dir mal auf die schnelle zwei Versionen als Windows-Forms zum ausprobieren zusammen gestellt:

back-to-topVariante 1 mit herkömmlicher Textbox


function GenerateForm {
    Add-Type -A System.Windows.Forms
    # error provider object
    $ep = New-Object System.Windows.Forms.ErrorProvider
    # form object
    $form1 = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '320,80'  
        Text = "Key-Input"  
    }
    # text input 
    $txt = New-Object System.Windows.Forms.TextBox -P @{
        Name = 'txt1'  
        Location = '10,10'  
        Size = '290,20'  
        Anchor = 'Top,Left,Right'  
        MaxLength = 29
        TextAlign = 'Center'  
        Font = New-Object System.Drawing.Font('Microsoft Sans Serif',9)  
        # subscribe KeyDown Event
        add_KeyDown = {
            # handle pasting key via CTRL-V
            if ($_.Control -and $_.KeyCode -eq [System.Windows.Forms.Keys]::V){
                # clear errors
                $ep.Clear()
                $clip = Get-Clipboard -Format Text
                if ($clip -match '(([2-46-9a-df-hj-km-np-rt-y]){5}-){4}([2-46-9a-df-hj-km-np-rt-y]){5}'){  
                    $txt.Text = $matches
                }
                $txt.SelectionStart = $txt.Text.Length
            }
        }
        # subscribe KeyPress event
        add_KeyPress = {
            # clear errors
            $ep.Clear()
            # please note letters E, U, L, A, O, S, I, Z, AND numbers 1, 0, 5 are never used in the product key combination.
            if ($_.KeyChar -match '[2-46-9a-df-hj-km-np-rt-y]'){  
                $_.Handled = $false
                # convert to upper case
                $_.KeyChar = $_.KeyChar.toString().toUpper()
                # add dash after every five characters
                if ($txt.Text.Length -in (5,11,17,23)){
                    $txt.Text += "-"  
                    $txt.SelectionStart = $txt.Text.Length
                }
            # handle backspace key
            }elseif($_.KeyChar -eq [System.Windows.Forms.Keys]::Back){
                $_.Handled = $false
                # jump over dash on backspace
                if ($txt.Text.EndsWith('-')){  
                    $txt.Text = $txt.Text.Substring(0,$txt.Text.Length-1)
                    $txt.SelectionStart = $txt.Text.Length
                }
            # invalid char entered ignore input
            }else{
                $_.Handled = $true
            }
        }

        add_Click = {
            $txt.SelectionStart = $txt.Text.Length
        }
        add_DoubleClick = {
            $txt.SelectionStart = $txt.Text.Length
        }
    }
    # add button
    $btn = New-Object System.Windows.Forms.Button -P @{
        Text = "OK"  
        Location = '10,40'  
        Size = '300,30'  
        Anchor = 'Bottom,Left,Right'  
        add_Click = {
            # check general format of key
            if ($txt.Text -match '^(([2-46-9a-df-hj-km-np-rt-y]){5}-){4}([2-46-9a-df-hj-km-np-rt-y]){5}$'){  
                $form1.Close()
            }else{
                $ep.SetError($txt,'The key should be in this format XXXXX-XXXXX-XXXXX-XXXXX-XXXXX !')  
            }
        }
    }
    $form1.Controls.AddRange(@($txt,$btn))
    [void]$form1.ShowDialog()
    $txt.Text
}
GenerateForm


back-to-topVariante 2 mit MaskedTextbox Control:


Alternativ zur manuellen Methode oben kannst du auch zum MaskedTextBox Control greifen, das bietet schon diverse Funktionen zur Validierung und Anpassung der Nutzereingabe mit Masken und reduziert den selbst zu treibenden Aufwand.
function GenerateForm {
    Add-Type -A System.Windows.Forms
    # error provider object
    $ep = New-Object System.Windows.Forms.ErrorProvider
    # form object
    $form1 = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '320,80'  
        Text = "Key-Input"  
    }
    # text input with masked textbox
    $txt = New-Object System.Windows.Forms.MaskedTextBox -P @{
        Name = 'txt1'  
        Location = '10,10'  
        Size = '290,20'  
        Anchor = 'Top,Left,Right'  
        AsciiOnly = $true
        # set mask: set to uppercase and onyl use ASCII Letters and Numbers with dashes
        Mask = '>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA'  
        Font = New-Object System.Drawing.Font('Microsoft Sans Serif',9)  

        add_TextChanged ={
            $ep.Clear()
        }
    }
    # add button
    $btn = New-Object System.Windows.Forms.Button -P @{
        Text = "OK"  
        Location = '10,40'  
        Size = '300,30'  
        Anchor = 'Bottom,Left,Right'  
        add_Click = {
            # check if mask is completed
            if (!$txt.MaskFull){
                $ep.SetError($txt,'The key is not complete!')  
                return
            }
            # check general format of key
            if ($txt.Text -match '^(([2-46-9a-df-hj-km-np-rt-y]){5}-){4}([2-46-9a-df-hj-km-np-rt-y]){5}$'){  
                $form1.Close()
            }else{
                $ep.SetError($txt,'The key should be in this format: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX (letters E, U, L, A, O, S, I, Z, AND numbers 1, 0, 5 should never be used) !')  
            }
        }
    }
    $form1.Controls.AddRange(@($txt,$btn))
    [void]$form1.ShowDialog()
    $txt.Text
}
GenerateForm

Grüße Uwe
SYNTAX1001
SYNTAX1001 11.10.2021 um 09:04:25 Uhr
Goto Top
Genau so etwas habe ich gesucht!
Danke dir!!!

Gruß Jannik