Подтвердить что ты не робот

Могу ли я изменить название моего FolderBrowserDialog?

Мне любопытно, и это может придать моему маленькому приложению приятный штрих. Спасибо!

4b9b3361

Ответ 1

Вы не можете, если вы используете класс FolderBrowserDialog напрямую. Но я где-то читал, что можно изменить заголовок с помощью P/Invoke и отправить сообщение WM_SETTEXT.

По-моему, это не стоит боли. Просто используйте свойство Описание, чтобы добавить информацию:

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

Ответ 2

Простой ответ заключается в том, что вы не можете. В диалоговом окне отображается стандартное название для диалогового окна стиля браузера папок в Windows. Лучший вариант - убедиться, что у вас есть осмысленный описательный текст, установив свойство Description.

Даже если вы должны использовать P/Invoke для вызова функции SHBrowseForFolder Win32 API, единственный вариант, который вы по-прежнему не можете изменить фактическое название диалога. Вы можете установить поле lpszTitle структуры BROWSEINFO, которая

Указатель на строку с нулевым завершением который отображается над древовидным представлением управления в диалоговом окне. Эта строка может использоваться для указания инструкций для пользователя.

Ответ 3

Вы можете изменить его, используя:

SetWindowText (hwnd, "Select a Folder");

Где hwnd - дескриптор окна, который запускает диалоговое окно "Обзор папки".

Ответ 4

Я искал, как это сделать, но во многом должен был понять это сам. Надеюсь, это сэкономит кому-нибудь время:

Над моим основным методом я положил:

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

Это сработало для меня, и это не так сложно. Надеюсь, что это поможет любому, кто может наткнуться на этой странице. Кстати, помните, что поток должен запускаться до того, как будет открыто диалоговое окно, чтобы он мог запускаться и проверять окно, как только оно существует.