【问题标题】:Windows powershell show FolderBrowserDialog in taskbarWindows powershell 在任务栏中显示 FolderBrowserDialog
【发布时间】:2019-03-05 09:34:41
【问题描述】:

我有 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

【问题讨论】:

    标签: windows powershell


    【解决方案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()
    

    所以,这个,Min/Max,当然可能是一个糟糕的用户体验,你将不得不权衡那个用例。

    现在,您还可以使用上述方法通过进行此修改来确保对话框始终位于最顶部,并且在关闭之前无法单击其他对象。

    示例:

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

    【讨论】:

    • 我非常感谢您的回复。是的,我同意我可能不得不寻找另一种选择。我正在将 phpdesktop 用于应用程序,并且只需要它能够获取用户输入以选择其驱动器上的文件夹。我个人从未涉足过 .net 或 Visual Studio 领域的任何东西。您究竟会建议我创建什么来处理这个需要最少时间和学习才能完成的事情,因为我不是用 C++ 或 C# 编写的
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多