【问题标题】:PowerScript: System.Windows.Forms.FolderBrowserDialog opening in the backgroundPowerScript:System.Windows.Forms.FolderBrowserDialog 在后台打开
【发布时间】:2020-11-12 09:31:01
【问题描述】:

PowerScript Noob 在这里。

我发现了一段代码,它允许用户通过文件夹浏览器对话框选择文件夹,而不是手动输入文件夹的路径。

按预期工作,除了文件夹浏览器对话框经常在屏幕上的其他窗口后面打开,这越来越令人厌烦。

代码如下:

Function Get-Folder($initialDirectory)

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

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.Description = "Select a folder"
    $foldername.rootfolder = "MyComputer"
    $foldername.SelectedPath = $initialDirectory

    if($foldername.ShowDialog() -eq "OK")
    {
        $folder += $foldername.SelectedPath
    }
    return $folder
}

$FolderNavn = Get-Folder($StartFolder)

如何让文件夹浏览器对话框“在”所有其他 Windows 之上打开?

谢谢。

【问题讨论】:

    标签: powershell folderbrowserdialog


    【解决方案1】:

    要设置 BrowseForFolder 对话框 TopMost,您需要使用 ShowDialog() 重载方法和指定对话框所有者(父)表单的参数。

    我认为最简单的方法是创建一个属性 Topmost 设置为 $true 的新表单并将其用作所有者表单:

    function Get-Folder {
        [CmdletBinding()]
        param (
            [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0)]
            [string]$Message = "Please select a directory.",
    
            [Parameter(Mandatory=$false, Position=1)]
            [string]$InitialDirectory,
    
            [Parameter(Mandatory=$false)]
            [System.Environment+SpecialFolder]$RootFolder = [System.Environment+SpecialFolder]::Desktop,
    
            [switch]$ShowNewFolderButton
        )
        Add-Type -AssemblyName System.Windows.Forms
        $dialog = New-Object System.Windows.Forms.FolderBrowserDialog
        $dialog.Description  = $Message
        $dialog.SelectedPath = $InitialDirectory
        $dialog.RootFolder   = $RootFolder
        $dialog.ShowNewFolderButton = if ($ShowNewFolderButton) { $true } else { $false }
        $selected = $null
    
        # force the dialog TopMost
        # Since the owning window will not be used after the dialog has been 
        # closed we can just create a new form on the fly within the method call
        $result = $dialog.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true }))
        if ($result -eq [Windows.Forms.DialogResult]::OK){
            $selected = $dialog.SelectedPath
        }
        # clear the FolderBrowserDialog from memory
        $dialog.Dispose()
        # return the selected folder
        $selected
    } 
    

    【讨论】:

    • 谢谢。有没有办法可以将 $InitialDirectory 作为参数提供给 Get-Folder 函数?
    • @RipRapRob 抱歉,我现在有点晚了。我会在明天回复你。
    • @RipRapRob 我已更改InitialDirectory 参数以接受字符串中的普通路径,并添加了一个参数RootFolder,您可以使用该参数为函数提供一个特殊文件夹作为起始路径。该参数默认使用桌面。如果您确实使用它来让对话框从其他地方开始,则在编辑器中,当您在参数 -RootFolder 之后键入一个空格以轻松选择可用的特殊文件夹之一时,您将获得智能感知。
    • 谢谢,我会在周末后测试这个:-)
    猜你喜欢
    • 2017-08-15
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多