Windows PowerShell показывает FolderBrowserDialog на панели задач - PullRequest
0 голосов
/ 05 марта 2019

У меня есть Windows PowerShell, открывающий диалог для выбора файла.Он работает нормально и возвращает результат по мере необходимости.Однако как я могу заставить .FolderBrowserDialog также появляться на панели задач и сохранять его .TopMost все время, пока не будет выбрана папка.Мой код выполняется нормально, без ошибок, но не отображается на панели задач, и при нажатии на другое окно диалоговое окно скрывается за всем остальным.Я в тупике

[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

$foldername = New-Object System.Windows.Forms.FolderBrowserDialog
$foldername.ShowNewFolderButton = $False

$Topmost = New-Object System.Windows.Forms.Form
$Topmost.TopMost = $True
$Topmost.MinimizeBox = $True
$Topmost.ShowInTaskbar = $True;

$foldername.Description = "Select Your Music Directory"
$foldername.RootFolder = "MyComputer"

$foldername.ShowDialog($Topmost) | Out-Null
return $foldername.SelectedPath

1 Ответ

0 голосов
/ 05 марта 2019

То, что вы спрашиваете, невозможно, так как оно не позволяет отображать опцию на панели задач в зависимости от способа выполнения вызова.

При выполнении кода вы заметитечто он вообще не отображается на панели задач, даже если вы ничего не нажимаете.

Выполнение этой старой школы, хотя и считается устаревшей, дает тот же графический интерфейс и будет отображаться на панели задач ...

Пример

$application = New-Object -ComObject Shell.Application
$path = ($application.BrowseForFolder(0, 'Select a folder', 0)).Self.Path

... недостатком здесь является то, что он не отображается автоматически как самый верхний, что вынуждает вас найти его напанель задач, чтобы щелкнуть по нему, чтобы привести его в фокус.Итак, вам нужно добавить код для решения этой проблемы.

Пример

$application = New-Object -ComObject Shell.Application
$application.MinimizeAll()
$path = ($application.BrowseForFolder(0, 'Select a folder', 0)).Self.Path
$application.UndoMinimizeALL()

Итак, это, Мин / Макс, конечно, можетесли вы плохо знакомы с пользователем, вам придется взвесить этот вариант использования.

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

Пример:

$handle = [System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle
$application = New-Object -ComObject Shell.Application
($path = ($application.BrowseForFolder([int]$handle, 'Select a folder', 0)).Self.Path)

Учитывая все, ИМХО, исходя из того, что вы после, вы можетеВы хотите создать свой собственный графический интерфейс WPF для этого или простую форму запуска для этого.

Грубый пример:

$null = Add-Type -AssemblyName System.Windows.Forms
$form = new-object Windows.Forms.Form 

$dlg = new-object Windows.Forms.FolderBrowserDialog 

$button = new-object Windows.Forms.Button 
$button.Text = "Push me!" 
$button.Dock = "fill" 
$button.add_click({$dlg.ShowDialog()}) 
$form.Controls.Add($button) 

$form.Add_Shown({$form.Activate()}) 
$form.ShowDialog()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...