Отображение диалогового окна Windows Explorer из приложения C ++

У меня есть приложение для Windows, написанное на C ++.
Приложение генерирует определенные файлы конфигурации в скрытом каталоге.
Я хочу дать пользователю возможность открыть этот каталог из моего приложения.
Нажатие на эту опцию должно открыть диалоговое окно, подобное проводнику Windows, с указанием местоположения входного каталога.
Я трачу время на поиск похожих API, но в итоге получаю определенные диалоги, такие как «DlgDirListComboBoxW» или «GetOpenFileName» или «GetSaveFileName».
Я ищу API для открытия обычного проводника Windows, такого как Dialog, с указанием местоположения входного каталога.
Было бы очень полезно, если бы API входил в раздел CommonDialogs.

1

Решение

Как насчет:

HWND hWndOwner = NULL;

ShellExecute(
hWndOwner,
_T("explore"),
_T("c:\\some\\path"),
NULL,
NULL,
SW_SHOWNORMAL);

Вы можете установить hWndOwner на ваш дескриптор главного окна, если вы так склонны и можете выбирать из множества других вариантов.

Для получения дополнительной информации и сведений об использовании посетите страницу MSDN на ShellExecute.

1

Другие решения

Вы можете использовать SHBrowseForFolder

Это показывает диалог, подобный этому:

введите описание изображения здесь

Это пример того, как его использовать:

BOOL GetFolder(LPCSTR folderpath,
LPCSTR szCaption,
HWND hOwner /*= NULL*/)
{
BOOL retVal = FALSE;

// The BROWSEINFO struct tells the shell
// how it should display the dialog.
BROWSEINFO bi;
memset(&bi, 0, sizeof(bi));

bi.ulFlags   = BIF_USENEWUI;
bi.hwndOwner = hOwner;
bi.lpszTitle = szCaption;

// must call this if using BIF_USENEWUI
::OleInitialize(NULL);

// Show the dialog and get the itemIDList for the
// selected folder.
LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);

if(pIDL != NULL)
{
// Create a buffer to store the path, then
// get the path.
char buffer[_MAX_PATH] = {'\0'};
if(::SHGetPathFromIDList(pIDL, buffer) != 0)
{
// Set the string value.
folderpath = buffer;
retVal = TRUE;
}

// free the item id list
CoTaskMemFree(pIDL);
}

::OleUninitialize();

return retVal;
}
0

По вопросам рекламы [email protected]