Alejandro Aviña
Alejandro Aviña

Reputation: 86

Getting keypress on a Form in Powershell

Im trying to make a image viewer in powershell using some windows forms libraries, I can already store the images location inside an array, but now I want it to detect the keys Right and Left to change between the locations inside the array

Here is the code I'm using:

param(
[parameter (Mandatory=$false, position=0, ParameterSetName='url')]
[string]$url = ''
)
Add-Type -AssemblyName 'System.Windows.Forms'
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.Application]::EnableVisualStyles()
Function Load-Images{
    param (
        [parameter (Mandatory=$true, position=0, ParameterSetName='path')]
        $path
    )

    $screen = [System.Windows.Forms.Screen]::AllScreens
    $form = new-object Windows.Forms.Form

    $form.Text = "Image Viewer"
    $form.Size = New-Object System.Drawing.Size($screen.WorkingArea[0].Width, $screen.WorkingArea[0].Height)
    
    $pictureBox = new-object Windows.Forms.PictureBox
    $pictureBox.Size = New-Object System.Drawing.Size($screen.WorkingArea[0].Width, $screen.WorkingArea[0].Height)
    
   
    $pictureBox.Image = $path
    $pictureBox.SizeMode = 'Zoom'
    $pictureBox.Anchor = 'Top,Left,Bottom,Right'

    $form.controls.add($pictureBox)
    $form.Add_Shown( { $form.Activate() } )

    $form.ShowDialog()
    $img.dispose()
}

if(!$url) {
    $dir = Get-Location

    $Files = @(Get-ChildItem "$($dir.Path)\*" -Include *.jpg, *.jpeg, *.png)
    $maxSize = $Files.Length
    Write-Output $maxSize
    Write-Output $Files.Fullname
    $img = [System.Drawing.Image]::Fromfile((Get-Item $Files.Fullname[0]))
    Load-Images -path $img

}

Upvotes: 0

Views: 3094

Answers (1)

postanote
postanote

Reputation: 16086

Continuing from my comment. What you are after is not specific to PowerShell at all. It's a UX/UI design/property/event item.

For Example, here is one showing adding and using the property/event setting to watch for defined keypresses. Just run the function, call the function, and hit 'Enter' or 'Esc', or click 'OK' to fire those events.

function Start-CreateForm 
{ 
 
    #Import Assemblies 
    Add-Type -AssemblyName System.Windows.Forms,
                           System.Drawing
 
    $Form1                  = New-Object System.Windows.Forms.Form 
    $OKButton               = New-Object System.Windows.Forms.Button 
    $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState 
    $Label1                 = New-Object System.Windows.Forms.Label
    $textBox1               = New-Object System.Windows.Forms.TextBox
    $Field1 = ""
 
    # Check for ENTER and ESC presses
    $Form1.KeyPreview = $True
    $Form1.Add_KeyDown({if ($PSItem.KeyCode -eq "Enter") 
        {
        # if enter, perform click
        $OKButton.PerformClick()
        }
    })
    $Form1.Add_KeyDown({if ($PSItem.KeyCode -eq "Escape") 
        {
        # if escape, exit
        $Form1.Close()
        }
    })
 
    # The action on the button
    $handler_OK_Button_Click= 
    { 
        $Field1 = $textBox1.Text
        $Field1
     
        # Returns a message of no data
        if ($Field1 -eq "") {[System.Windows.Forms.MessageBox]::Show("You didn't enter anything!", "Data")}
     
        # Returns what they types. You could add your code here
        else {[System.Windows.Forms.MessageBox]::Show($Field1, "Data")}  
    }
 
    $OnLoadForm_StateCorrection= 
    {
    $Form1.WindowState = $InitialFormWindowState 
    }
 
 
    # Form Code 
    $Form1.Name = "Data_Form"
    $Form1.Text = "Data Form" 
    $Form1.MaximizeBox = $false #lock form
    $Form1.FormBorderStyle = 'Fixed3D'
    # None,FixedDialog,FixedSingle,FixedToolWindow,Sizable,SizableToolWindow
 
    # Icon
    $Form1.Icon = [Drawing.Icon]::ExtractAssociatedIcon((Get-Command powershell).Path)
    # $NotifyIcon.Icon = [Drawing.Icon]::ExtractAssociatedIcon((Get-Command powershell).Path)
 
    $Form1.DataBindings.DefaultDataSourceUpdateMode = 0 
    $Form1.StartPosition = "CenterScreen"# moves form to center of screen
    $System_Drawing_Size = New-Object System.Drawing.Size 
    $System_Drawing_Size.Width = 300 # sets X
    $System_Drawing_Size.Height = 150 # sets Y
    $Form1.ClientSize = $System_Drawing_Size
 
    $OKButton.Name = "OK_Button" 
    $System_Drawing_Size = New-Object System.Drawing.Size 
    $System_Drawing_Size.Width = 45
    $System_Drawing_Size.Height = 23
 
    $OKButton.Size = $System_Drawing_Size 
    $OKButton.UseVisualStyleBackColor = $True
    $OKButton.Text = "OK"
    $System_Drawing_Point = New-Object System.Drawing.Point 
    $System_Drawing_Point.X = 30 
    $System_Drawing_Point.Y = 113
 
    $OKButton.Location = $System_Drawing_Point 
    $OKButton.DataBindings.DefaultDataSourceUpdateMode = 0 
    $OKButton.add_Click($handler_OK_Button_Click)
    $Form1.Controls.Add($OKButton)
 
    $InitialFormWindowState = $Form1.WindowState 
    $Form1.add_Load($OnLoadForm_StateCorrection) 
 
    $Label1.Location = New-Object System.Drawing.Point(10,20)
    $Label1.Size = New-Object System.Drawing.Size(280,20)
    $Label1.Text = "Enter data here:"
    $Form1.Controls.Add($Label1)
  
    $textBox1.TabIndex = 0 # Places cursor in field
    $textBox1.Location = New-Object System.Drawing.Point(10,40)
    $textBox1.Size = New-Object System.Drawing.Size(260,20)
    $Form1.Controls.Add($textBox1)
    $Form1.Topmost = $True # Moves form to top and stays on top
    $Form1.Add_Shown({$textBox1.Select()})
 
    # Show Form 
    $Form1.ShowDialog()
}

For your use case, you just have to use the needed keyboard specifics.

Upvotes: 1

Related Questions