2013-11-01 39 views
0

用於選擇文件夾選擇窗口的SelectFolderDialog。但我想出現或用戶選擇只驅動器。不應選擇驅動器內的文件夾。 所以用戶應該得到如C:D:E等驅動器:etc 有沒有任何選項可以做到這一點?只有驅動器的SelectFolderDialog,驅動器內沒有文件夾選擇

+0

這是文件夾不是一個好主意,那些在c:\ disks \ myexternusb等下安裝其他驅動器的人呢?在Win2000 +上,人們可以很好地控制東西的安裝位置...... – Anders

回答

1

這僅允許您選擇的路徑短於4個字符我的電腦裏面,如果你要隱藏的對話框中,你需要編寫一個插件,實現IFolderFilter(操作系統+專用)

#BIF_RETURNONLYFSDIRS 0x00000001 
#BIF_NEWDIALOGSTYLE 0x00000040 
#BIF_NONEWFOLDERBUTTON 0x00000200 
!include LogicLib.nsh 
!include WinMessages.nsh 
!define /math BFFM_ENABLEOK ${WM_USER} + 101 
!define BFFM_SELCHANGED 2 
System::Call 'SHELL32::SHGetSpecialFolderLocation(i0,i0x11,*i.r2)i.r0' 
System::Get "(i.R0,i.R1,i.R2,i)iR9R9" 
Pop $3 
System::Call '*(i$hwndparent,i$2,i,t "Hello",i0x241,kr3,i0,i0)i.r1' 
System::Call 'SHELL32::SHBrowseForFolder(ir1)i.r0' 
Sys_BFFCALLBACK: 
    ${If} $R9 == "callback1" 
     ${If} ${BFFM_SELCHANGED} = $R1 
      System::Call 'SHELL32::SHGetPathFromIDList(i$R2,t "" R9)' 
      StrLen $R9 $R9 
      ${IfThen} $R9 > 3 ${|} StrCpy $R9 0 ${|} 
      SendMessage $R0 ${BFFM_ENABLEOK} 0 $R9 
     ${EndIf} 
     StrCpy $R9 0 ; return value 
     System::Call $3 
     Goto Sys_BFFCALLBACK 
    ${EndIf} 
System::Free $3 ; system callback 
System::Call 'OLE32::CoTaskMemFree(ir2)' ; BROWSEINFO.pidlRoot 
System::Free $1 ; BROWSEINFO 
${If} $0 <> 0 
    System::Call 'SHELL32::SHGetPathFromIDList(i$0,t "" R9)' 
    MessageBox mb_ok SHBrowseForFolder=$R9 
${EndIf} 
System::Call 'OLE32::CoTaskMemFree(ir0)' ; pidl result 
相關問題