BROWSEINFO bi;
ZeroMemory( &bi, sizeof( bi ) );
bi.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
bi.pidlRoot = NULL;
LPITEMIDLIST targetLocation = SHBrowseForFolder( &bi );
if ( targetLocation != NULL )
{
TCHAR targetPath[ MAX_PATH ];
SHGetPathFromIDList( targetLocation, targetPath );
}BIF_RETURNONLYFSDIRS加了为什么选择我的电脑时候OK还是能按下的?谁给说说谢谢
ZeroMemory( &bi, sizeof( bi ) );
bi.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
bi.pidlRoot = NULL;
LPITEMIDLIST targetLocation = SHBrowseForFolder( &bi );
if ( targetLocation != NULL )
{
TCHAR targetPath[ MAX_PATH ];
SHGetPathFromIDList( targetLocation, targetPath );
}BIF_RETURNONLYFSDIRS加了为什么选择我的电脑时候OK还是能按下的?谁给说说谢谢
这个需要自己写BrowseCallbackProc了
static int CALLBACK BrowseCallbackProc(
HWND hwnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData
)
{
if(uMsg==BFFM_SELCHANGED||uMsg==BFFM_INITIALIZED)
{
CString strDir;
if(!::SHGetPathFromIDList((LPITEMIDLIST)lParam, strDir.GetBuffer(MIN_BUFFER_SIZE)))
{
::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
}
else
{
//这里可以判断下是否选中软盘、光驱之类的
TCHAR cDriver[MIN_BUFFER_SIZE];
DWORD dw = GetLogicalDriveStrings(MIN_BUFFER_SIZE, cDriver);
for(int i = 0; i < dw; i += 4)
{
TCHAR cNow[4] = {cDriver[i],':','\\'};
CString str1 = cNow;
if(strDir == str1)
{
int nDriveType = GetDriveType(cNow);
if(nDriveType == DRIVE_CDROM || nDriveType == DRIVE_REMOVABLE)
{
::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
}
}
}
}
strDir.ReleaseBuffer();
}
return 0;
}然后在你定义BROWSEINFO的时候bi.lpfn = BrowseCallbackProc;
这个需要自己写BrowseCallbackProc了
static int CALLBACK BrowseCallbackProc(
HWND hwnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData
)
{
if(uMsg==BFFM_SELCHANGED||uMsg==BFFM_INITIALIZED)
{
CString strDir;
if(!::SHGetPathFromIDList((LPITEMIDLIST)lParam, strDir.GetBuffer(MIN_BUFFER_SIZE)))
{
::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
}
else
{
//这里可以判断下是否选中软盘、光驱之类的
TCHAR cDriver[MIN_BUFFER_SIZE];
DWORD dw = GetLogicalDriveStrings(MIN_BUFFER_SIZE, cDriver);
for(int i = 0; i < dw; i += 4)
{
TCHAR cNow[4] = {cDriver[i],':','\\'};
CString str1 = cNow;
if(strDir == str1)
{
int nDriveType = GetDriveType(cNow);
if(nDriveType == DRIVE_CDROM || nDriveType == DRIVE_REMOVABLE)
{
::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
}
}
}
}
strDir.ReleaseBuffer();
}
return 0;
}然后在你定义BROWSEINFO的时候bi.lpfn = BrowseCallbackProc;
nDriveType == DRIVE_REMOVABLE,移动硬盘和SD卡不是也被干掉了?
你可以测试下,移动硬盘貌似不会干掉,会干掉U盘
你要的只是选中“我的电脑”时候,OK不能点
这里你可以完全管软盘或光驱之类的,因为若选择了软盘或光驱,程序会有提示的