0

在 nsis SelectFolderDialog 中用于文件夹选择窗口。但我想出现或用户只选择驱动器。驱动器内不应该选择文件夹。所以用户应该得到像 C: D: E: etc 这样的驱动器有什么选择吗?

4

1 回答 1

1

这仅允许您在“我的电脑”中选择短于 4 个字符的路径,如果您想隐藏对话框中的文件夹,您需要编写一个插件并实现 IFolderFilter(仅限 WinXP+)

#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
于 2013-11-01T21:55:19.817 回答