#include <tchar.h>
#include <windows.h>
#include <shlobj.h>
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch (uMsg)
{
case BFFM_INITIALIZED:
{
if (lpData)
{
SendMessage(hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData);
}
HWND hWndTree = FindWindowEx(hWnd, NULL, _T("SysTreeView32"), NULL);
if (!hWndTree)
hWndTree = FindWindowEx(hWnd, NULL, _T("SHBrowseForFolder ShellNameSpace Control"), NULL);
if (hWndTree)
PostMessage(hWnd, WM_NEXTDLGCTL, (WPARAM)hWndTree, 1L);
HWND hWndCaption = FindWindowEx(hWnd, NULL, _T("STATIC"), NULL);
if (hWndCaption)
{
SetWindowText(hWndCaption, _T("Please select folder"));
}
}
break;
case BFFM_SELCHANGED:
{
TCHAR szDir[MAX_PATH * sizeof(TCHAR)] = {0};
BOOL bRet = SHGetPathFromIDList((LPITEMIDLIST) lParam, szDir);
if (bRet)
{
bRet = (_taccess(szDir, 0) == 0);
}
if (!bRet)
{
EnableWindow(GetDlgItem(hWnd, IDOK), FALSE);
}
}
break;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
BROWSEINFO bi = {0};
TCHAR szPath[MAX_PATH] = _T("C:\WINDOWS");
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_BROWSEFORCOMPUTER | BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM)(LPCTSTR)szPath;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
if (pidl)
{
TCHAR szFolder[MAX_PATH * sizeof(TCHAR)] = {0};
if (SHGetPathFromIDList(pidl, szFolder))
MessageBox(NULL, szFolder, _T("Selected Folder"), NULL);
CoTaskMemFree(pidl);
}
CoUninitialize();
return 0;
}