浏览文件夹对话框:居中并制作最顶层



我有一个BrowseForFolder-DialogWinforms Gui

有没有办法使此对话框成为最顶层窗口和/或将其居中在屏幕上?

$getfolder = New-Object -com shell.application
$foldername = $getfolder.BrowseForFolder(0,"Text",16,"")

您必须指定所有者句柄。

$handle = [System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle
$getfolder = New-Object -ComObject Shell.Application
$foldername = $getfolder.BrowseForFolder([int]$handle, "Text", 16, "")

但它是COM和.NET的混合体。我推荐以下解决方案

$win32WindowDefinition = @"
using System;
using System.Windows.Forms;
public class Win32Window : IWin32Window
{
    public Win32Window(IntPtr handle)
    {
        Handle = handle;
    }
    public IntPtr Handle { get; private set; }
}
"@
Add-Type -TypeDefinition $win32WindowDefinition -ReferencedAssemblies System.Windows.Forms.dll 
$ownerHandle = New-Object Win32Window -ArgumentList ([System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle)
$folderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog
$dialogResult = $folderBrowserDialog.ShowDialog($ownerHandle)
if ($dialogResult -eq [System.Windows.Forms.DialogResult]::OK) {
    $folderName = $folderBrowserDialog.SelectedPath
}

与 http://poshcode.org/2002 相比

如果您可以使用 FolderBrowserDialog ,将其显示为屏幕的最顶部和中心,则只需将TopMost表单传递给其ShowDialog方法即可。

C# 示例

var f = new FolderBrowserDialog();
f.ShowDialog(new Form() { TopMost = true}); 
this.Activate();

电源外壳示例

[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$folder = New-Object System.Windows.Forms.FolderBrowserDialog
$form = New-Object System.Windows.Forms.Form -property @{TopMost = $True}
$folder.ShowDialog($form)

最新更新