показывал папки в отдельном окне
часть информации собрал на англо-язычных сайтах
там в архиве некоторые коментарии переведены
и читаются ужасно, но понять можно
сам то я вот что хочу выяснить
куда записать значение пути чтоб при повторном вызове окна обзора
эта папка была уже открыта, а корневая папка так-же оставалась бы
рабочим столом
ниже текст + архив прилагаю:
- Код: Выделить всё
Option Explicit
'При нажатии на кнопку вы получите доступ ко всем папкам и файлам
'компьютера. Вы можете ограничить возможность выбирать только папки.
'Наличие BIF-констант в вызываемой функции и определяет такие возможности
'по выбору.
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Enum WhatBrowse
BIF_RETURNONLYFSDIRS = 1 'Только вернуться каталоги файловой системы. Если пользователь выбирает папки, которые не являются частью файловой системы, кнопка ОК будет недоступна. // Примечание Кнопка ОК остается включенным для "\ \ сервер" предметов, а также "\ \ сервер \ акцию" и предметов каталога. Однако, если пользователь выбирает пункт "\ \ сервер", попутный PIDL возвращаемый SHBrowseForFolder , чтобы SHGetPathFromIDList не удается.
BIF_DONTGOBELOWDOMAIN = 2 'Не включайте сетевые папки ниже уровня домена в управления иерархического диалогового окна.
BIF_STATUSTEXT = 4 'Включите область состояния в диалоговом окне. Функция обратного вызова можно установить текст состояния, посылая сообщения в диалоговое окно. Этот флаг не поддерживается, если BIF_NEWDIALOGSTYLE указан.
BIF_RETURNFSANCESTORS = 8 'Только вернуться файловой системы предков. Предком является вложенной, что это под корневой папке в иерархии пространства имен. Если пользователь выбирает предка корневой папке, что не является частью файловой системы, кнопка ОК будет недоступна.
BIF_EDITBOX = 16 'Включите элемент управления редактирования в диалоговом окне просмотра, что позволяет пользователю ввести имя элемента.
BIF_VALIDATE = 32 'Если пользователь недопустимое имя в поле редактирования, диалоговое окно просмотра называет приложения BrowseCallbackProc с сообщением BFFM_VALIDATEFAILED. Этот флаг игнорируется, если BIF_EDITBOX не уточняется.
BIF_NEWDIALOGSTYLE = 64 'Используйте новый пользовательский интерфейс. Установка этого флага предоставляет пользователю с большим диалоговом окне может быть изменен. Диалоговое окно имеет несколько новых возможностей, в том числе: возможность перетащить и падение в диалоговом окне, изменения порядка, контекстных меню, новые папки, удалять и других команд контекстного меню. // Примечание Если COM инициализируется через CoInitializeEx с COINIT_MULTITHREADED установленным флагом, SHBrowseForFolder терпит неудачу, если BIF_NEWDIALOGSTYLE передается.
BIF_USENEWUI = 80 'Используйте новый пользовательский интерфейс, в том числе в поле ввода. Этот флаг эквивалентен BIF_EDITBOX | BIF_NEWDIALOGSTYLE. // Примечание Если COM инициализируется через CoInitializeEx с COINIT_MULTITHREADED установленным флагом, SHBrowseForFolder терпит неудачу, если BIF_USENEWUI передается.
BIF_BROWSEINCLUDEURLS = 128 'Диалоговое окно просмотра может отображать URL. Флаги BIF_USENEWUI и BIF_BROWSEINCLUDEFILES также должен быть установлен. Если любой из этих трех флагов не установлен, то в диалоговом окне Браузер отвергает URL. Даже когда эти флаги установлены, диалоговое окно обзора отображает URL-адреса, только если папка, которая содержит выбранный элемент поддерживает URL. Когда папка в IShellFolder :: GetAttributesOf метод называется запросить атрибуты выбранного элемента, папка должна установить флаг атрибута SFGAO_FOLDER. В противном случае, диалоговое окно просмотра не будет отображать URL.
BIF_UAHINT = 256 'В сочетании с BIF_NEWDIALOGSTYLE, добавляет намек использования в диалоговое окно, вместо окне редактирования. BIF_EDITBOX отменяет этот флаг.
BIF_NONEWFOLDERBUTTON = 512 'Не включайте кнопку New Folder в диалоговом окне просмотра
BIF_NOTRANSLATETARGETS = 1024 'Если выбранный элемент является сокращением, вернуть PIDL самого ярлыка, а не его цель.
BIF_BROWSEFORCOMPUTER = 2048 'Только вернуть компьютеры. Если пользователь выбирает ничего, кроме компьютера, кнопка ОК будет недоступна.
BIF_BROWSEFORPRINTER = 4096 'Только позвольте выбор принтеров. Если пользователь выбирает ничего, кроме принтера, кнопка ОК будет недоступна.
BIF_BROWSEINCLUDEFILES = 8192 'Диалоговое окно просмотра отображает файлы, а также папки.
BIF_SHAREABLE = 16384 'Диалоговое окно просмотра может отображать совместно используемых ресурсов на удаленных системах. Это предназначено для приложений, которые хотят выставить удаленных акций на локальной системе. Флаг BIF_NEWDIALOGSTYLE также должен быть установлен.
BIF_BROWSEFILEJUNCTIONS = 32768 'Windows 7 и выше. Разрешить папки переходов, таких как библиотеки или сжатый файл с расширением. Имя архива, чтобы можно просматривать.
End Enum
Private Const MAX_PATH = 260
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Public Function fBrowseForFolder(hWndOwner As Long, sPrompt As String, WhatBr) As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
With udtBI
.hWndOwner = hWndOwner
.lpszTitle = lstrcat(sPrompt, "")
.ulFlags = WhatBr
End With
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then sPath = Left$(sPath, iNull - 1)
End If
fBrowseForFolder = sPath
End Function
Private Sub Command1_Click()
Dim sStr As String
'вместо входящего параметра BIF_BROWSEINCLUDEFILES вы можете использовать одну из
'BIF-констант, описанных строчкой Private Enum WhatBrowse (смотри в разделе General_Declarations)
sStr = fBrowseForFolder(hWnd, "Выберите папку, файл, принтер или компьютер", 1 + BIF_EDITBOX)
Text1.Text = sStr
End Sub