Powershell. Вывод всплывающего сообщения на экран/MsgBox

Я не нашел способа сделать так,  что бы вызываемое окно было поверх всех остальных окон, с помощью стандартных средств PS:

[System.Windows.Forms.MessageBox]::Show("Message","Title")

Но я знаю что в VBS есть свойство MsgBox под названием SystemModal, которое как раз и заставляет появляться popup окно поверх всех, расположенных на экране.

Мы можем убедиться в этом так:

# Добавляем в сеанс возможность использовать VBS
Add-Type -AssemblyName Microsoft.VisualBasic
# Смотрим доступные свойства
[System.Enum]::GetNames( [Microsoft.VisualBasic.MsgBoxStyle] )

Убедившись в наличии нужного свойства, мы можем использовать этот Workaround aka «костыль»:

# Выводим MsgBox поверх всех окон
[Microsoft.VisualBasic.Interaction]::MsgBox("Text", "OKOnly,SystemModal,Information", "Title")
UPD:

В итоге я разобрался, как используя Forms.MessageBox сделать окно «поверх всех».

( $FrmMain = New-Object 'System.Windows.Forms.Form' ).TopMost = $True
[System.Windows.Forms.MessageBox]::Show($FrmMain,"Текст", "Заголовок", 4, 48)

На первый взгляд этот способ ничем не лучше предыдущего, но он немного короче и не требует подгрузки дополнительных компонентов.
А так же в PowerShell версии 6.1 удален командлет Add-Type.

Хотя VisualBasic по прежнему должен  подгружаться через .NET

[System.Reflection.Assembly]::loadwithpartialname("Microsoft.VisualBasic")
 Посмотреть доступные типы форм и иконок можно следующими командами
[System.Enum]::GetNames([System.Windows.Forms.MessageBoxButtons])
[System.Enum]::GetNames([System.Windows.Forms.MessageBoxIcon])

Еще у полученных параметров есть соответствующие им числовые коды, кстати такие же как и в VBS:

# Выбор типа используемой формы
Ok = 0
OkCancel = 1
AbortRetryIgnore = 2
YesNoCancel = 3
YesNo = 4
RetryCancel= 5

# А доступные иконки с помощью
Critical = 16
Question = 32
Warning = 48
Informational = 64
Записать ответ диалогового окна в переменную

Бонусом напишу, что для получения ответа в переменную нужно просто присвоить ей команду на вызов окна:

$ans = [System.Windows.Forms.MessageBox]::Show($FrmMain,"Вы хотите открыть Блокнот?", "Подтверждение", 4, 32)
if($ans -eq "Yes"){start Notepad}

Одна мысль про “Powershell. Вывод всплывающего сообщения на экран/MsgBox”

Добавить комментарий

Ваш адрес email не будет опубликован.