DialogBoxes.psm1
class DialogBoxesOptionModel { $InputMessage $InputType DialogBoxesOptionModel($message, $inputType) { $this.InputMessage = $message $this.InputType = $inputType } } function Get-NewDialogBoxesOptionsList() { return New-Object 'System.Collections.Generic.List[DialogBoxesOptionModel]' } function Get-NewDialogBoxesOptionModel() { param ( $InputMessage, $InputType ) return [DialogBoxesOptionModel]::new($InputMessage, $InputType) } function Show-Alert { param( [Parameter(Mandatory = $true)] [string] $Message ) Add-Type -AssemblyName PresentationFramework $result = [System.Windows.MessageBox]::Show($Message, "Prompt", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning, [System.Windows.MessageBoxResult]::OK, [System.Windows.MessageBoxOptions]::DefaultDesktopOnly ) return $result; } function Get-UserInput { param ( [Parameter(Mandatory = $true)] [string] $Message ) Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $form = New-Object System.Windows.Forms.Form $form.Text = $Message $form.Size = New-Object System.Drawing.Size(300, 200) $form.StartPosition = 'CenterScreen' $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Point(75, 120) $okButton.Size = New-Object System.Drawing.Size(75, 23) $okButton.Text = 'OK' $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $okButton $form.Controls.Add($okButton) $cancelButton = New-Object System.Windows.Forms.Button $cancelButton.Location = New-Object System.Drawing.Point(150, 120) $cancelButton.Size = New-Object System.Drawing.Size(75, 23) $cancelButton.Text = 'Cancel' $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $cancelButton $form.Controls.Add($cancelButton) $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10, 20) $label.Size = New-Object System.Drawing.Size(280, 20) $label.Text = $Message $form.Controls.Add($label) $textBox = New-Object System.Windows.Forms.TextBox $textBox.Location = New-Object System.Drawing.Point(10, 40) $textBox.Size = New-Object System.Drawing.Size(260, 20) $form.Controls.Add($textBox) $form.Topmost = $true $form.Add_Shown({ $textBox.Select() }) $result = $form.ShowDialog() if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $x = $textBox.Text return $x; } return $null; } function Get-UserInputMultiple { param ( [Parameter(Mandatory = $true)]$Messages ) Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $incrment = 20; $gap = 50; $labelToInputGap = 30; $textBoxSize = 5; $labelWidth = 280 $leftPadding = 10; $labelLocation = $incrment; $inputLocation = $incrment + $labelToInputGap $formYLen = ($Messages.Count * (( $textBoxSize * 2) + $labelToInputGap + $incrment )) + 250 # ( $labelToInputGap + $textBoxSize + $textBoxSize + $gap + $incrment )) if ($Messages.Count -ge 11) { $formYLen += 100 } $formXLen = $labelWidth + ($leftPadding * 4) $form = New-Object System.Windows.Forms.Form $form.Text = $Message $form.Size = New-Object System.Drawing.Size($formXLen, $formYLen) $form.StartPosition = 'CenterScreen' $form.Topmost = $true foreach ($message in $Messages) { $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point($leftPadding, $labelLocation) $label.Size = New-Object System.Drawing.Size($labelWidth, (( $textBoxSize * 2) + $labelToInputGap + $incrment )) $label.Text = $message $textBox = New-Object System.Windows.Forms.TextBox $textBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxSize)) $textBox.Size = New-Object System.Drawing.Size($labelWidth, $textBoxSize ) $label.Controls.Add($textBox); $form.Controls.Add($label); $labelLocation += $incrment + $gap $inputLocation += $incrment + $gap } $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Point(75, $inputLocation) $okButton.Size = New-Object System.Drawing.Size(75, 23) $okButton.Text = 'OK' $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $okButton $form.Controls.Add($okButton) $cancelButton = New-Object System.Windows.Forms.Button $cancelButton.Location = New-Object System.Drawing.Point(175, $inputLocation) $cancelButton.Size = New-Object System.Drawing.Size(75, 23) $cancelButton.Text = 'Cancel' $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $cancelButton $form.Controls.Add($cancelButton) $form.Add_Shown({ $textBox.Select() }) $result = $form.ShowDialog() $values = New-Object System.Collections.Generic.List[string] if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $vals = $form.Controls | Where-Object { $_.HasChildren -eq $true } foreach ($v in $vals) { $values.Add($v.Controls[0].Text); } return $values } return $null; } <# .SYNOPSIS Pass in an array of Messages and Input types to create those fields in a dialog box. .DESCRIPTION At the current time, only accepts check boxes and Text boxes. . .NOTES Use the DialogBoxesOptionModel to create the fields and boxes. Types are CheckBox AND TextBox .EXAMPLE function CreateDialogBoxOptions() { $userInputMessages = Get-NewDialogBoxesOptionsList $enableMfa = Get-NewDialogBoxesOptionModel -InputMessage "Enable user MFA?" -InputType "CheckBox" $project = Get-NewDialogBoxesOptionModel -InputMessage "Is this project user?"-InputType "CheckBox" $licenseType = Get-NewDialogBoxesOptionModel -InputMessage "Office 365 License Name." -InputType "TextBox" $sendEmailToManager = Get-NewDialogBoxesOptionModel -InputMessage "Send email to manager when complete?" -InputType "CheckBox" $userInputMessages.Add($enableMfa) $userInputMessages.Add($project) $userInputMessages.Add($licenseType) $userInputMessages.Add($sendEmailToManager) $array = $userInputMessages.ToArray() $multiInputDialog = Get-UserInputMultipleWithOption -MessagesAndInputTypes $array return $multiInputDialog } #> function Get-UserInputMultipleWithOption { param ( [Parameter(Mandatory = $true)][DialogBoxesOptionModel[]] $MessagesAndInputTypes, [Int32] $FontSize = 10 ) $font = New-Object System.Drawing.Font('Arial', $FontSize); $checkBox = "CheckBox" $textBox = "TextBox" Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $incrment = 20; $textBoxYSize = $([System.Windows.Forms.TextRenderer]::MeasureText($checkBox, $font).Height) + 5 $gap = $textBoxYSize * 2.2 # 100; $labelToInputGap = $textBoxYSize; $maxLabelLen = 0; foreach ($messageI in $MessagesAndInputTypes) { $messagePixels = [System.Windows.Forms.TextRenderer]::MeasureText($messageI.InputMessage, $font) if ($messagePixels.Width -gt $maxLabelLen) { $maxLabelLen = $messagePixels.Width } } $labelWidth = 280 + $maxLabelLen $leftPadding = 10; $labelLocation = $incrment; $inputLocation = $incrment + $labelToInputGap $formYLen = ($MessagesAndInputTypes.Count * (( $textBoxYSize * 2) + $labelToInputGap + $incrment )) + 250 # ( $labelToInputGap + $textBoxYSize + $textBoxYSize + $gap + $incrment )) if ($Messages.Count -ge 11) { $formYLen += 100 } $formXLen = $labelWidth + ($leftPadding * 4) $form = New-Object System.Windows.Forms.Form $form.Text = $Message $form.Size = New-Object System.Drawing.Size($formXLen, $formYLen) $form.StartPosition = 'CenterScreen' $form.Topmost = $true $form.Font = $font foreach ($message in $MessagesAndInputTypes) { $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point($leftPadding, $labelLocation) $label.Size = New-Object System.Drawing.Size($labelWidth, (( $textBoxYSize ) + $labelToInputGap + $incrment )) $label.Text = $message.InputMessage $labelPixels = [System.Windows.Forms.TextRenderer]::MeasureText($label.Text, $font) if ($labelPixels.Width -gt ($formYLen - 50)) { $mult = $labelPixels.Width / ($formYLen - 50) $labelPixels.Height = $labelPixels.Height * $mult } if ($message.InputType -eq $textBox) { $inputBox = New-Object System.Windows.Forms.TextBox # $inputBox.Height = $textBoxYSize $inputBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxYSize)) $inputBox.Size = New-Object System.Drawing.Size($labelWidth, $textBoxYSize ) } elseif ($message.InputType -eq $checkBox) { $inputBox = New-Object System.Windows.Forms.CheckBox # $inputBox.Height = $textBoxYSize $inputBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxYSize)) $inputBox.AutoSize = $true } $label.Controls.Add($inputBox); $form.Controls.Add($label); $labelLocation += $incrment + $gap $inputLocation += $incrment + $gap } $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Point((75 + ($maxLabelLen / 2 )), $inputLocation) $okButton.Text = 'OK' $okButton.Size = New-Object System.Drawing.Size((([System.Windows.Forms.TextRenderer]::MeasureText($okButton.Text, $font).Width) + 20), $textBoxYSize) $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $okButton $form.Controls.Add($okButton) $cancelButton = New-Object System.Windows.Forms.Button $cancelButton.Location = New-Object System.Drawing.Point((175 + ($maxLabelLen / 2 )), $inputLocation) $cancelButton.Text = 'Cancel' $cancelButton.Size = New-Object System.Drawing.Size( (([System.Windows.Forms.TextRenderer]::MeasureText($cancelButton.Text, $font).Width) + 20), $textBoxYSize) $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $cancelButton $form.Controls.Add($cancelButton) $form.Add_Shown({ $inputBox.Select() }) $result = $form.ShowDialog() $values = New-Object System.Collections.Generic.List[string] if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $vals = $form.Controls | Where-Object { $_.HasChildren -eq $true } foreach ($v in $vals) { $control = $v.Controls[0] $type = $control.GetType().Name; if ($type -eq $checkBox) { $values.Add($control.Checked) } else { $values.Add($control.Text); } } return $values } return $null; } function Get-FolderPathDialog { param ( [string] $HelpText = "Please select folder.", [string] $InitialFolder = "MyComputer" ) Add-Type -AssemblyName System.Windows.Forms $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog $FolderBrowser.RootFolder = $InitialFolder $FolderBrowser.Description = $HelpText1 $result = $FolderBrowser.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true; Name = $HelpText })) if ($result -eq [Windows.Forms.DialogResult]::OK) { return $FolderBrowser.SelectedPath } else { Show-Alert -Message "Folder path was canceled." exit; } } <# .SYNOPSIS Gets the path to the selected folder, and returns true or false .DESCRIPTION returns 2 element array of [0]path(string) and [1]state(bool) .EXAMPLE $path = Get-FolderPathDialogV2 -HelpText "please enter path to output the JSON file."; if ($false -eq $path[1]) { return "Path was not selected." } #> function Get-FolderPathDialogV2 { param ( [string] $HelpText = "Please select folder.", [string] $InitialFolder = "MyComputer" ) Add-Type -AssemblyName System.Windows.Forms $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog $FolderBrowser.RootFolder = $InitialFolder $FolderBrowser.Description = $HelpText1 $result = $FolderBrowser.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true; Name = $HelpText })) if ($result -eq [Windows.Forms.DialogResult]::OK) { return ($true, $FolderBrowser.SelectedPath) } else { Show-Alert -Message "Folder path was canceled." return ($false, "") } } function Get-FileDialog { param ( [string] $FileTypeFilter = "", [string] $HelpText = "Please select file." ) Add-Type -AssemblyName System.Windows.Forms $fileBrowser = New-Object System.Windows.Forms.OpenFileDialog $fileBrowser.Title = $HelpText $fileBrowser.Filter = $FileTypeFilter $fileBrowser.Multiselect = $false $fileBrowser.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true; Name = $HelpText })) | Out-Null return $fileBrowser.FileName } function Show-ConfirmationBox { param( [Parameter(Mandatory = $true)][string] $Message, [Parameter(Mandatory = $true)][string] $Title ) return [System.Windows.Forms.MessageBox]::Show($Message, $title, "YesNo", "Information", "Button1"); } <# .SYNOPSIS Create a sinlge list box popup box. .DESCRIPTION Show the user a list of items and allow them to select ONE. .EXAMPLE $list = "Test 1", "Test 2", "Test 3", "Test 4", "Test 5" $t = Get-UserInputListBox -LabelText "Test Label Text" -ItemsList $list Write-Host $t #> function Get-UserInputListBox { param( [Parameter(Mandatory = $true)][string]$LabelText, [Parameter(Mandatory = $true)]$ItemsList ) Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $form = New-Object System.Windows.Forms.Form $form.Text = $LabelText $form.Size = New-Object System.Drawing.Size(300, 200) $form.StartPosition = 'CenterScreen' $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Point(75, 120) $okButton.Size = New-Object System.Drawing.Size(75, 23) $okButton.Text = 'OK' $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $okButton $form.Controls.Add($okButton) $cancelButton = New-Object System.Windows.Forms.Button $cancelButton.Location = New-Object System.Drawing.Point(150, 120) $cancelButton.Size = New-Object System.Drawing.Size(75, 23) $cancelButton.Text = 'Cancel' $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $cancelButton $form.Controls.Add($cancelButton) $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10, 20) $label.Size = New-Object System.Drawing.Size(280, 20) $label.Text = $LabelText $form.Controls.Add($label) $listBox = New-Object System.Windows.Forms.ListBox $listBox.Location = New-Object System.Drawing.Point(10, 40) $listBox.Size = New-Object System.Drawing.Size(260, 20) $listBox.Height = 80 foreach ($item in $ItemsList) { [void] $listBox.Items.Add($item) } $form.Controls.Add($listBox) $form.Topmost = $true $result = $form.ShowDialog() if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $x = $listBox.SelectedItem return $x } } #Export-ModuleMember -Function Get-UserInput #Export-ModuleMember -Function Show-Alert #Export-ModuleMember -Function Get-FolderPathDialog |