4

我正在寻找如何将键盘焦点自动设置为 powershell 中的文本框。

我有一个脚本,要求用户从下拉菜单中选择一个选项,然后根据该选择,他们必须输入某些参数。这一切都很好。

为了便于使用,我希望每次显示新键盘时,键盘的焦点都会转移到输入框,这样用户就不必一直点击它来输入一些文本。

到目前为止我的代码:

function inputBox($parameter)
{
$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = $parameter
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$paramValue=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}})



$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,90)
$OKButton.Size = New-Object System.Drawing.Size(75,25)
$OKButton.Text = "OK"
$OKButton.Add_Click({$paramValue=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = $parameter
$objForm.Controls.Add($objLabel) 

$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox.Size = New-Object System.Drawing.Size(260,20) 
$objForm.KeyPreview = $True
$objForm.Controls.Add($objTextBox) 

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

return $paramValue

有任何想法吗?

谢谢!

4

6 回答 6

9

按照您的代码,我可以在其中找到一个下拉菜单,以便在显示表单时将焦点放在文本框上:

$objForm.Add_Shown({$objForm.Activate(); $objTextBox.focus()})
于 2012-07-16T09:09:21.007 回答
2

尝试以下Select方法以防万一Focus()

if($textbox.CanFocus)
{
   $textbox.Focus()
}
else
{
   $textbox.Select()
}
于 2012-07-16T09:08:31.540 回答
0

效果很好,但我需要使paramValue变量脚本全局(Add_Click例程内的范围不是脚本范围,paramValue设置丢失)。使用$Global:paramValue对我有用。

于 2019-05-06T10:14:02.897 回答
0

这是@CB 和@Shay Levy 答案的替代方案(它们都不适合我):

$objForm.Add_Shown( { $objTextBox.Select() })
于 2019-06-18T13:27:18.283 回答
0

我想为这个问题添加两个额外的替代解决方案。

只需将您的$objTextBox创建代码移动到上面的第一个位置$OKButton

代码始终从上到下进行初始化和优先排序。有了这个小小的改变,它会选择你的TextBox第一个。

对于第二个解决方案,手动添加一个TabIndex优先级。

$objTextBox.TabIndex = 0

$OKButton.TabIndex = 1

较低的数字被优先考虑并首先得到关注。

于 2021-08-12T05:51:58.533 回答
-2

与原始帖子和焦点一起使用的代码是:

if ( $objTextBox.CanFocus )
{
$objTextBox.Focus()
}
else
{
$objTextBox.Select()
}
于 2013-11-21T15:44:31.440 回答