C# 浏览文件夹对话框:居中并使最上面

C# 浏览文件夹对话框:居中并使最上面,c#,winforms,powershell,C#,Winforms,Powershell,我有一个winformsgui,带有一个BrowseForFolder对话框 有没有办法使此对话框成为最顶部的窗口和/或在屏幕上居中显示 $getfolder = New-Object -com shell.application $foldername = $getfolder.BrowseForFolder(0,"Text",16,"") 如果可以使用,将其显示为最顶部和屏幕中央,则只需将最顶部表单传递给其ShowDialog方法即可 C#示例 var f = new FolderBrow

我有一个
winformsgui
,带有一个
BrowseForFolder对话框

有没有办法使此对话框成为最顶部的窗口和/或在屏幕上居中显示

$getfolder = New-Object -com shell.application
$foldername = $getfolder.BrowseForFolder(0,"Text",16,"")
如果可以使用,将其显示为最顶部和屏幕中央,则只需将
最顶部
表单传递给其
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)
Powershell示例

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)

您必须指定所有者句柄

$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
}

来自

谢谢,但这如何转化为powershell?您的问题也有C#标签。无论如何,我也发布了Powershell代码:)谢谢。有时我能将C#翻译成powershell,但在这种情况下我不能。但是forms-FolderBrowser与我上面使用的不同。我需要能够A)在对话框中显示一个文本,b)在对话框中有一个可以手动输入路径的输入框。使用shell.application-folderbrowser,您可以使用BrowseInfo-flags配置它。文本可以使用
Description
属性设置,但是
TextBox
不能。第一个功能非常好。由于可能的选项标志,我需要COM变量。是否可以将对话框置于屏幕中央或设置位置?无法设置位置。可能的解决方案是创建自定义对话框。