我可以更改FolderBrowserDialog的标题吗?

时间:2009-08-19 02:28:39

标签: c# folderbrowserdialog

我很好奇,它可以给我的小应用程序一个很好的画龙点睛。谢谢!

4 个答案:

答案 0 :(得分:27)

如果直接使用FolderBrowserDialog类,则不能。但我在某处读到可以用P / Invoke更改标题并发送WM_SETTEXT消息。

在我看来,这不值得痛苦。只需使用说明属性添加信息:

FolderBrowserDialog dlg = new FolderBrowserDialog();
dlg.Description = "Select the document folder";

答案 1 :(得分:3)

简单的答案是,你做不到。该对话框使用Windows上的文件夹浏览器样式对话框的标准标题显示。最好的选择是通过设置Description属性来确保您具有有意义的描述性文本。

即使您使用P / Invoke直接调用SHBrowseForFolder Win32 API函数,唯一的选项仍然无法更改对话框的实际标题。您可以设置BROWSEINFO结构的lpszTitle字段,即

  

指向以null结尾的字符串的指针   显示在树视图上方   在对话框中控制。这个字符串   可用于指定指令   用户。

答案 2 :(得分:0)

您可以使用以下方法进行更改:

sqldf("select D.*, L.condition1 * D.[percentage_condition1] + 
       L.condition2 * D.[percentage_condition2] as new 
       from data as D 
       left join lookup as L 
       using(class, type)")

SetWindowText (hwnd, "Select a Folder"); 是窗口句柄,它会触发“浏览文件夹”对话框。

答案 3 :(得分:-1)

我一直在寻找如何执行此操作的方法,但很大程度上必须自己解决。 我希望这可以节省一些时间:

我上面的主要方法是:

    [DllImport("user32.dll", EntryPoint = "SetWindowText", CharSet = CharSet.Ansi)]
    public static extern bool SetWindowText(IntPtr hWnd, String strNewWindowName);
    [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Ansi)]
    public static extern IntPtr FindWindow(string className, string windowName);

由于我知道在显示对话框时该线程将暂停,因此我创建了一个新线程来检查该对话框是否存在。像这样:

    bool notfound = true;
    new Thread(() => { 
    while (notfound)
    {
        //looks for a window with the title: "Browse For Folder"
        IntPtr ptr = FindWindow(null, "Browse For Folder");
        if (ptr != IntPtr.Zero)
        {
            //tells the while loop to stop checking
            notfound = false;
            //changes the title
            SetWindowText(ptr, "Be happy!");
        }
    }
    }).Start();

然后,我启动对话框:

    using (var fbd = new FolderBrowserDialog())
    {
        DialogResult result = fbd.ShowDialog();
        if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
        {
            //do stuff
        }
    }

这对我有用,并不复杂。希望这对可能偶然浏览此页面的人有所帮助。 顺便说一句,请记住线程必须在启动对话框窗口之前启动,以便它可以运行并在存在窗口后立即对其进行检查。