Как вы можете установить фокус на поле ввода с PowerShell? - PullRequest
2 голосов
/ 12 октября 2010

Я использую следующий код PowerShell 2.0 для получения ввода из поля ввода vb:

[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$name = [Microsoft.VisualBasic.Interaction]::InputBox("What is your name?", "Name", "bob")

Иногда, когда я запускаю его, поле ввода появляется за активным окном. Есть ли способ сделать поле ввода сверху? Или простой способ получить его ручку и просто использовать setforegroundwindow?

Спасибо !!

Ответы [ 3 ]

5 голосов
/ 12 октября 2010

Я не уверен, как это легко сделать, учитывая, что вызов InputBox является модальным, поэтому вы не можете легко попытаться найти дескриптор окна и установить передний план в этом окне (если вы не попытаетесь использовать фоновое задание).Вместо того, чтобы использовать это поле ввода текста VisualBasic, как насчет «развернуть собственную» реализацию с использованием WPF / XAML.Это довольно просто, но для этого требуется WPF, который устанавливается PowerShell 2.0 в случае необходимости.

$Xaml = @'
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="Window"
        Title="Name" Height="137" Width="444" MinHeight="137" MinWidth="100"
        FocusManager.FocusedElement="{Binding ElementName=TextBox}"
        ResizeMode="CanResizeWithGrip" >
    <DockPanel Margin="8">
        <StackPanel DockPanel.Dock="Bottom" 
                    Orientation="Horizontal" HorizontalAlignment="Right">
            <Button x:Name="OKButton" Width="60" IsDefault="True" 
                    Margin="12,12,0,0" TabIndex="1" >_OK</Button>
            <Button Width="60" IsCancel="True" Margin="12,12,0,0" 
                    TabIndex="2" >_Close</Button>
        </StackPanel>
        <StackPanel >
            <Label x:Name="Label" Margin="-5,0,0,0" TabIndex="3">Label:</Label>
            <TextBox x:Name="TextBox" TabIndex="0" />
        </StackPanel>
    </DockPanel>
</Window>
'@

if ([System.Threading.Thread]::CurrentThread.ApartmentState -ne 'STA')
{
    throw "Script can only be run if PowerShell is started with -STA switch."
}

Add-Type -Assembly PresentationCore,PresentationFrameWork

$xmlReader = [System.Xml.XmlReader]::Create([System.IO.StringReader] $Xaml)
$form = [System.Windows.Markup.XamlReader]::Load($xmlReader)
$xmlReader.Close()

$window = $form.FindName("Window")
$window.Title = "My App Name"

$label = $form.FindName("Label")
$label.Content = "What is your name?"

$textbox = $form.FindName("TextBox")

$okButton = $form.FindName("OKButton")
$okButton.add_Click({$window.DialogResult = $true})

if ($form.ShowDialog())
{
    $textbox.Text
}

Это может быть довольно легко заключено в функцию Read-GuiText.

2 голосов
/ 18 января 2018

Если вы установите значение по умолчанию для поля ввода, оно как бы делает его «модальным», примерно так:

0 голосов
/ 21 декабря 2011
Sub SetInputBoxFocus()
    System.Threading.Thread.Sleep(300)
    Microsoft.VisualBasic.AppActivate("Title)
    ''Console.WriteLine("Setting focus ") '"
End Sub

Dim strPW as String = ""
Dim tsStartInfo As New System.Threading.ThreadStart(AddressOf SetInputBoxFocus)
Dim tBackgroundJob As New System.Threading.Thread(tsStartInfo)
tBackgroundJob.Start()
strPW = Microsoft.VisualBasic.InputBox("Prompt: ", "Title", "", -1, -1)
tBackgroundJob = Nothing
tsStartInfo = Nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...