Windows PEでバックアップ・リストア(3)

ではドライブ選択ダイアログを定義していきます。

# ============================================================
# 自作ドライブ選択ダイアログ(WinPE完全対応)
# ============================================================

function Select-Drive {

    $drivedlg = New-Object System.Windows.Forms.Form
    $drivedlg.Text = "Select Drive"
    $drivedlg.Size = New-Object System.Drawing.Size(360,260)
    $drivedlg.StartPosition = "CenterScreen"

    $drvList = New-Object System.Windows.Forms.ListBox
    $drvList.Location = New-Object System.Drawing.Point(10,10)
    $drvList.Size = New-Object System.Drawing.Size(320,170)
    $drvList.SelectionMode = "One"
    $drivedlg.Controls.Add($drvList)

    $drvokBtn = New-Object System.Windows.Forms.Button
    $drvokBtn.Text = "OK"
    $drvokBtn.Location = New-Object System.Drawing.Point(170,190)
    $drivedlg.Controls.Add($drvokBtn)

    $drvcancelBtn = New-Object System.Windows.Forms.Button
    $drvcancelBtn.Text = "Cancel"
    $drvcancelBtn.Location = New-Object System.Drawing.Point(250,190)
    $drivedlg.Controls.Add($drvcancelBtn)

    $choiceDrive = @()

    #容量付きでディスクドライブ列挙
    $diskdrv=get-disk | select-object -property Number,FriendlyName,SerialNumber,Size | sort-object Number

    foreach ($d in $diskdrv) {
        $driveNo = $d.Number
        $driveName =$d.FriendlyName
        $drvsizeGB = [math]::Round($d.Size/(1024*1024*1024),1)
        
        $drvList.Items.Add("$driveNo  $driveName  $drvsizeGB GB")
        $choiceDrive += $driveNo
    }


    # MouseUp で選択確定(WinPE対策)
    $drvList.Add_MouseUp({
        $idxx = $drvList.IndexFromPoint($drvList.PointToClient([System.Windows.Forms.Cursor]::Position))
        if ($idxx -ge 0) { $drvList.SelectedIndex = $idxx }
    })

    $drvokBtn.Add_Click({
    if ($drvList.SelectedIndex -ge 0) {
        $drivedlg.Tag = $diskdrv[$drvList.SelectedIndex].Number
    } else {
        $drivedlg.Tag = $null
    }
    $drivedlg.Close()
    })


    $drvcancelBtn.Add_Click({
        $drivedlg.Tag = $null
        $drivedlg.Close()
    })



    $drivedlg.ShowDialog() | Out-Null

    $resultdrv = $drivedlg.Tag
    if ($resultdrv -is [array]) { $resultdrv = $resultdrv[-1] }
    
    return $resultdrv


}

これを実行すると以下のようなダイアログが表示されます。なお、WindowsPEでは「選択した」というイベントがうまく扱えないので、選択した後でマウスが扱われた(MouseUPイベント)で処理するようにしています(AIにお聞きしております)。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です