Powershell TaskDialog - PullRequest
       9

Powershell TaskDialog

1 голос
/ 08 ноября 2010

Возможно ли использовать Windows 7 TaskDialog в PowerShell?

Я хотел бы преобразовать следующее окно сообщения в TaskDialog:

[System.Windows.Forms.MessageBox]::Show(
    "There are currently one or more Microsoft Office applications running.`n`nYou must close down all open Office applications before the template update can continue.", 
    "Updating Templates", 
    [System.Windows.Forms.MessageBoxButtons]::RetryCancel, 
    [System.Windows.Forms.MessageBoxIcon]::Warning )

Кто-нибудь знает, как / если это можно сделать?

Спасибо

Ben

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Для этого вам нужно использовать Microsoft Windows API CodePack , это очень просто, но хотя он будет отлично работать с PowerShell ISE, PoshConsole, PowerGUI и т. Д. - я не верю, что он будет работать в PowerShell.exe, поскольку консоль загружает неправильную версию comctl32.dll (библиотека общих элементов управления).

# import the library dll from wherever you put it:
add-type -path .\Libraries\Microsoft.WindowsAPICodePack.dll

# Create and configure the TaskDialog
$td = New-Object Microsoft.WindowsAPICodePack.Dialogs.TaskDialog
$td.Caption = "Updating Templates"
$td.Text = "There are currently one or more Microsoft Office applications running.`n`nYou must close down all open Office applications before the template update can continue."
$td.StandardButtons = "Retry,Cancel"
$td.Icon = "Warning"

# Show the dialog and capture the resulting choice
$result = $td.Show()  # will return either "Retry" or "Cancel" 

Надеемся, очевидно, что значение $result на самом деле является значением перечисления (типа [Microsoft.WindowsAPICodePack.Dialogs.TaskDialogResult])... но в PowerShell вы можете в основном обращаться с ним как со строкой или целым числом, если хотите.

Конечно, это едва ли царапает поверхность того, что вы можете сделать с помощью TaskDialog - если вы его используететолько с этим кодом он будет выглядеть и вести себя очень похоже на ваш текущий диалог - но вы можете самостоятельно изучить другие возможности - я могу порекомендовать инструмент компоновщика TaskDialog из этой статьи MSDN Magazine как способузнать много вариантов.

0 голосов
/ 08 ноября 2010

Вы можете использовать командлет Add-Type, чтобы скомпилировать класс C # на лету и импортировать тип. Таким образом, вы можете просто записать код C # для взаимодействия с встроенной функцией TaskDialog, а затем использовать его из PowerShell. Например, вы можете использовать эту библиотеку из CodeProject . Постройте его и затем используйте

Add-Type -File TaskDialog.dll

Затем можно заново создать образцы, показанные в статье.

$taskDialog = New-Object Microsoft.Samples.TaskDialog
$taskDialog.WindowTitle = "My Application"
$taskDialog.MainInstruction = "Do you want to do this?"
$taskDialog.CommonButtons = [Microsoft.Samples.TaskDialogCommonButtons]::Yes -bor [Microsoft.Samples.TaskDialogCommonButtons]::No
$result = $taskDialog.Show()
if ($result -eq 6)
{
    # Do it.

}

Однако я заметил, что PowerShell не может найти точку входа в DLL общего управления. Не слишком много в этом ключе, возможно, объявлению P / Invoke в коде C # потребуется запрос конкретной версии или около того, чтобы это работало. Сожалею. Возможно, вы все еще можете инкапсулировать необходимые вещи в небольшое приложение командной строки, которое затем сможете запустить. Не идеальный, но, возможно, самый простой маршрут.

...