PowerShellで文字を入力するダイアログのサンプル

powershell コンピュータ
powershell

シンプルに文字を入力をするダイアログになります。

<#
.SYNOPSIS
文字を入力するダイアログのサンプル
#>

using namespace System.Windows.Forms
using namespace System.Drawing
using namespace System.IO

Set-StrictMode -Version Latest
$ErrorActionPreference = "STOP"

#?アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

function InputDialogShow
{
    param(
        $form,
        $message="こちらに入力",
        $title="タイトル",
        $inputText=""
    )

    $dialog = [Form]::new() | ForEach-Object {
        $_.Size = "360,200"
        $_.Text = $title
        $_
    }
    $controls = @(
        [Label]::new() | ForEach-Object {
            $_.Size = "300,30"
            $_.Location = "20,20"
            $_.Text = $message
            $_
        }
        [TextBox]::new() | ForEach-Object {
            $_.Name = "InputText"
            $_.Size = "300,30"
            $_.Location = "20,60"
            $_.Text = $inputText
            $_.Add_KeyDown({
                if ($_.KeyCode -eq "Return")
                {
                    $dialog.DialogResult = 1;
                    $dialog.Close();    
                }
            })
            $_
        }
        [Button]::new() | ForEach-Object {
            $_.Size = "100,30"
            $_.Location = "60,100"
            $_.Text = "OK"
            $_.Add_Click({
                $dialog.DialogResult = 1;
                $dialog.Close();
            })
            $_
        }
        [Button]::new() | ForEach-Object {
            $_.Size = "100,30"
            $_.Location = "180,100"
            $_.Text = "Cancel"
            $_.Add_Click({
                $dialog.DialogResult = 2;
                $dialog.Close();
            })
            $_
        }

    )
    $dialog.Controls.AddRange($controls)
    $result = $dialog.ShowDialog($form)
    $inputText = $dialog.Controls["InputText"].Text

    return [PSCustomObject]@{
        "DialogResult"=$result
        "InputText"=$inputText
    }
}
function Main
{
    # メインフォームの生成
    $form = [Form]::new() | ForEach-Object {
        $_.Size = "400,300"
        $_
    }

    # コントロールの生成
    $controls = @(
        [Button]::new() | ForEach-Object {
            $_.Size = "100,50"
            $_.Location = "130,100"
            $_.Text = "実行"
            $_.Add_Click({
                $result = InputDialogShow $this "こちらに入力" "タイトル" "初期値"
                if ($result.DialogResult -eq 1)
                {
                    [MessageBox]::Show($result.InputText)
                }
            })
            $_
        }
    )

    # フォームにコントロールを配置
    $form.Controls.AddRange($controls)

    # フォームの表示
    $form.ShowDialog()
}
Main

「実行」ボタンを押す

ダイアログが表示

文字を入力し「エンターキー」または「OK」ボタンを押す

入力した文字列がメッセージボックスに表示

ダイアログのルーチンをInputDialogShowにまとめていますので、引数に呼び出し元のコントロールをセットし呼び出します。
戻り値にPSCustomObjectでDialogResultと入力したテキストがセットされています。
DialogResultは1がOK,2がCancelになります。

コメント