Windows Powershell在任务栏中显示FolderBrowserDialog

时间:2019-03-04 21:13:38

标签: windows powershell

我使用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 :(得分:1)

您的询问是不可能的,因为由于您拨打电话的方式,它不允许有选择地在任务栏中显示选项。

在运行代码时,您会注意到,即使您没有单击其他任何内容,它也不会显示在任务栏中。

这所古老的学校虽然被认为已贬值,但它具有相同的GUI并显示在任务栏中...

示例

$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 GUI或为此创建一个简单的启动表单。

粗略示例:

$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()