亀の甲羅2

今日もまた朝とく起きて励まなん窓に明るきありあけの月

poweshell 入力フィールドを持つGUIウィンドウを作成する(Bing)

Bingに作らせてみた。BingAIは指示代名詞が使えるので、簡単な質問から始めて徐々に深化させて要求する答えを導くことができる。なかなか使える。

  1. powershellGUIウィンドウを表示するスクリプト
  2. サンプルスクリプト
  3. 上記に入力フィールドとOKボタンを追加したスクリプトを作成して下さい。
  4. 上記を入力内容を返却する関数に修正して下さい。
  5. 上記にキャンセルボタンを追加して下さい。キャンセルボタンを押下したときは、ウィンドウを閉じてください。
  6. 上記のスクリプトで、ウィンドウサイズ変更不可にして下さい。
  7. 上記で最小化ボタンと閉じるボタン(×ボタン)も消してください。
  8. 上記でEnter押下したときにOKボタンを作動させてください。
  9. 上記で「入力してください」というラベルを加えて下さい。
  10. 上記で「入力してください」と「【お知らせ】」の部分を引数として与えられるように改変して下さい。

というプロンプトを経てできたスクリプトが下記の通り。

function Show-InputBox ([string] $FormTitle = "【お知らせ】", [string] $InputLabel = "入力してください") {
    # アセンブリの読み込み
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

    # オブジェクトを生成
    $Form = New-Object System.Windows.Forms.Form

    # フォームのサイズ
    $Form.Size = New-Object System.Drawing.Size(400, 300)

    # フォームの表示場所
    $Form.Location = New-Object System.Drawing.Size(1500, 700)

    # フォームの表示設定
    $Form.StartPosition = "manual"

    # フォームのテキスト
    $Form.Text = $FormTitle

    # ウィンドウサイズ変更不可にする
    $Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog
    $Form.MaximizeBox = $false

    # 最小化ボタンと閉じるボタン(×ボタン)を消す
    $Form.ControlBox = $false

    # 入力フィールドを追加
    $InputBox = New-Object System.Windows.Forms.TextBox
    $InputBox.Location = New-Object System.Drawing.Point(10, 60)
    $InputBox.Size = New-Object System.Drawing.Size(360, 20)
    $InputBox.Add_KeyDown({
        if ($_.KeyCode -eq [System.Windows.Forms.Keys]::Enter) {
            $Form.DialogResult = [System.Windows.Forms.DialogResult]::OK
            $Form.Close()
        }
    })
    $Form.Controls.Add($InputBox)

    # 入力してくださいというラベルを追加
    $InputLabelControl = New-Object System.Windows.Forms.Label
    $InputLabelControl.Location = New-Object System.Drawing.Point(10, 40)
    $InputLabelControl.Size = New-Object System.Drawing.Size(360, 20)
    $InputLabelControl.Text = $InputLabel
    $Form.Controls.Add($InputLabelControl)

    # OKボタンを追加
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Point(120, 100)
    $OKButton.Size = New-Object System.Drawing.Size(75, 23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click({
        $Form.DialogResult = [System.Windows.Forms.DialogResult]::OK
        $Form.Close()
    })
    $Form.Controls.Add($OKButton)

    # キャンセルボタンを追加
    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Point(200, 100)
    $CancelButton.Size = New-Object System.Drawing.Size(75, 23)
    $CancelButton.Text = "キャンセル"
    $CancelButton.Add_Click({
        $Form.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
        $Form.Close()
    })
    $Form.Controls.Add($CancelButton)

    # フォームを表示
    $Form.Add_Shown({$Form.Activate()})

    # フォームをアクティブ
    if ($Form.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
        return $InputBox.Text
    } else {
        return ""
    }
}

# 関数を呼び出して入力内容を取得する例(引数あり)
$inputText1 = Show-InputBox -FormTitle "【確認】" -InputLabel "名前を入力してください"
Write-Host "入力内容1: $inputText1"

# 関数を呼び出して入力内容を取得する例(引数なし)
$inputText2 = Show-InputBox
Write-Host "入力内容2: $inputText2"

Bingちゃんの説明は下記の通り。

このスクリプトは、Show-InputBoxという関数を定義しています。この関数は、GUIウィンドウを表示し、入力フィールドとOKボタン、キャンセルボタンが配置されています。OKボタンをクリックすると、入力フィールドに入力されたテキストが返却されます。キャンセルボタンをクリックすると、ウィンドウが閉じられます。

Enterキーを押下したときにOKボタンを作動させるために、$InputBoxオブジェクトにKeyDownイベントハンドラーを追加しています。このイベントハンドラーでは、押下されたキーがEnterキーかどうか判定し、Enterキーであれば、フォームのDialogResultプロパティをOKに設定して、フォームを閉じています。

関数を呼び出すことで、入力内容を取得することができます。

「入力してください」というラベルを追加するために、$InputLabelオブジェクトを作成し、LocationプロパティとSizeプロパティ、Textプロパティを設定しています。そして、$InputLabelオブジェクトをフォームのコントロールに追加しています。

このスクリプトは、Show-InputBoxという関数を定義しています。この関数は、$FormTitleパラメーターと$InputLabelパラメーターを受け取ります。これらのパラメーターは、それぞれフォームのテキストとラベルのテキストに使用されます。

関数を呼び出す際に、引数としてフォームのテキストとラベルのテキストを指定することができます。引数が指定されていない場合は、デフォルト値が使用されます。

関数を呼び出すことで、入力内容を取得することができます。


別解としてVisualBasicアセンブリを使ってフォームを作成することもできる。powershell3.0以降で動作するとのこと。
こっちはあまり深追いしなかった。

Add-Type -AssemblyName Microsoft.VisualBasic
Add-Type -AssemblyName System.Windows.Forms

$result = [Microsoft.VisualBasic.Interaction]::InputBox("メッセージ", "タイトル", "デフォルト値")

if ($result -ne "") {
    [System.Windows.Forms.MessageBox]::Show($result, "入力された値")
}