GetOpenFileName изменить каталог

Вопрос:

Кто-нибудь знает, как изменить текущий каталог уже запущенного диалогового окна открытия файла?

Подробности:

У меня есть настроенное диалоговое окно открытия файла (с использованием пользовательского шаблона для добавления дополнительных элементов управления), в котором также отключены все проверки, существующие проверки и тесты создания (через флаги OpenFileName).

Отключение этих вещей отключает встроенное поведение диалогового окна, которое заставит его изменить текущую отображаемую папку, если пользователь введет имя папки в поле со списком «имя файла» и нажмет клавишу ввода.

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

Однако я не могу понять, как программно указать диалогу изменить текущий каталог.

Я думал, что смогу сделать это, отправив какое-то сообщение элементу управления SHELLDLL_DefView в окне, но я не смог найти по нему никакой документации.


person Scott Wisniewski    schedule 22.01.2009    source источник


Ответы (2)


Я не уверен в прямом ответе, но если у вас есть SPY++ или любая другая программа для отслеживания сообщений, попробуйте проверить сообщения, которые появляются при изменении каталога обычного диалогового окна OpenFileName. Вы можете найти ответ там (хотя это трудный путь).

Хотя кто-то другой может знать ответ навскидку; будем надеяться, что они делают.

person lc.    schedule 22.01.2009

Я смог найти обходной путь.

Оказывается, когда проверка отключена, ввод имени каталога, оканчивающегося на «\», все равно изменит отображаемую папку, но ввод имени каталога, не заканчивающегося на «\», не изменит.

Используя spy++, я смог увидеть, что при нажатии клавиши ввода сообщение WM_COMMAND будет отправлено в общий диалоговый элемент управления с аргументом wParam, старшее слово которого — BN_CLICKED, а младшее слово — ID_OK.

Если я подклассифицирую общий диалог, я могу перехватить сообщение, изменить текст в поле со списком имени файла, перенаправить сообщение в исходную процедуру подкласса, а затем изменить текст обратно.

Это немного хак, но он позволяет мне получить поведение, которое я хочу от диалога.

person Scott Wisniewski    schedule 23.01.2009