Возможно, вы пытаетесь создать форму без каких-либо элементов управления, или когда при наборе клавиши возвращается определенное значение до того, как сфокусированный элемент управления получает нажатую клавишу?
В этом случае я бы определил область действия получающей переменнойвход должен иметь как минимум область действия script
, например: $script:FormResult
В качестве демонстрации небольшая форма, не имеющая других элементов управления, просто метка, показывающая некоторые действия, из которых пользователь может выбрать, нажав клавишу
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Select option"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
# with this, the form will receive key events before the event is passed to the control that has focus.
$objForm.KeyPreview = $true
$Label = New-Object System.Windows.Forms.Label
$Label.Location = New-Object System.Drawing.Size(10,20)
$Label.AutoSize = $true
$label.Text = @"
Select an action to perform.
1. Perform action 1
2. Perform action 2
3. Perform action 3
Press Escape to cancel
Press Enter to perform all actions
"@
$objForm.Controls.Add($Label)
$objForm.Add_KeyDown({
$script:FormResult = $null
switch ($_.KeyCode) {
{'Enter','Return' -contains $_} { $script:FormResult = 'AllActions' ; break }
{'D1', 'NumPad1' -contains $_} { $script:FormResult = 'Action1'; break }
{'D2', 'NumPad2' -contains $_} { $script:FormResult = 'Action2'; break }
{'D3', 'NumPad3' -contains $_} { $script:FormResult = 'Action3'; break }
'Escape' { $script:FormResult = 'Cancel' }
}
if ($script:FormResult) { $objForm.Close() }
})
[void] $objForm.ShowDialog()
# clean up the form from memory when done
$objForm.Dispose()
После этого вы можете проверить все, что выбрал пользователь, используя переменную $script:FormResult
Надеюсь, что это поможет