急问,用SHBrowseForFolder函数打开文件夹时,如何让其模态显示?现在是非模态的可以打开很多个:(

krqii 2004-08-26 06:17:53
我现在用到的代码
With typBrowseInfo
.lRoot = CSIDL_DESKTOP ' CSIDL_DRIVES
.sTitle = "test"
.lOptions = BIF_RETURNONLYFSDIRS
End With
lngFoldPointer = SHBrowseForFolder(typBrowseInfo)
盼望你们的回答:)
...全文
254 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
krqii 2004-08-27
  • 打赏
  • 举报
回复
xiexie
大家
给分:)
krqii 2004-08-26
  • 打赏
  • 举报
回复
我们要求的是用OFFICE2000,我自偷用的XP,还不支持:(
怎么能让它模态呢?
krqii 2004-08-26
  • 打赏
  • 举报
回复
啊?:(
咋整?:(
郁闷了
不过还是谢谢你们
非常感谢,希望还能有办法
yinweihong 2004-08-26
  • 打赏
  • 举报
回复
Excel2002新增的属性,2000不支持 呵呵
难怪了`````````````
krqii 2004-08-26
  • 打赏
  • 举报
回复
在Excel的VBA编辑器中输入一下 rainstormmaster(暴风雨 v2.0)
后边修改你的代码或你是的代码都可以
只要把句柄设置为application.hwnd就可以了
因为我在Excel里能拿到的句柄就是那个:(
你们所有打开的窗口都是非模态的
就是在打开时,还可以干其他的事情:(
yinweihong 2004-08-26
  • 打赏
  • 举报
回复
可以把你的代码贴出来看看么?~~``````````````
krqii 2004-08-26
  • 打赏
  • 举报
回复
to rainstormmaster(暴风雨 v2.0)
VBA中不可以吧?我能拿到的句柄就是application.hwnd
:(
rainstormmaster 2004-08-26
  • 打赏
  • 举报
回复
把yinweihong(KAO,不会API,郁闷~===laji!!) 的代码简单修改了一下,应该可以了:

Option Explicit
Private Const MAX_PATH = 260
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Const BIF_RETURNONLYFSDIRS = 1
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)

Private Function BrowseFolder(hwndOwner As Long, sPrompt As String) As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
udtBI.hwndOwner = hwndOwner
udtBI.lpszTitle = lstrcat(sPrompt, "")
udtBI.ulFlags = BIF_RETURNONLYFSDIRS
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then sPath = Left$(sPath, iNull - 1)
End If
BrowseFolder = sPath
End Function

Private Sub Command1_Click()
BrowseFolder Me.hWnd, "test"
End Sub
krqii 2004-08-26
  • 打赏
  • 举报
回复
to zyl910(910:分儿,我又来了!) yinweihong(KAO,不会API,郁闷~===laji!!)
我在VBA中使用的,能设置的.hwndOwner只能是application.hwnd但是不好使:(
krqii 2004-08-26
  • 打赏
  • 举报
回复
to hhjjhjhj(大头)
用你的了,是只能打开一个
但是用户还是能做这个之后的动作:(
我想指定它为模态
如果实在不行就用你的方案了:)
yinweihong 2004-08-26
  • 打赏
  • 举报
回复
你能够点的到?
eg:
Private Sub Command1_Click()
Call BrowseFolder(Me.hWnd, "请选择文件夹:")
End Sub
zyl910 2004-08-26
  • 打赏
  • 举报
回复
设置.hwndOwner元素后就是模态的!
hhjjhjhj 2004-08-26
  • 打赏
  • 举报
回复
/////还是不行,这样打开的还是非模态的,可以打开很多个的:(///////
有没有试过我的,说白了就是用一变量控制!
rainstormmaster 2004-08-26
  • 打赏
  • 举报
回复
//你在一个按钮下调用BrowseFolder
点很多次按钮就打开很多个了:(

用 hhjjhjhj(大头)的代码试试,应该可以解决你的问题
krqii 2004-08-26
  • 打赏
  • 举报
回复
to yinweihong(KAO,不会API,郁闷~===laji!!)
你在一个按钮下调用BrowseFolder
点很多次按钮就打开很多个了:(
yinweihong 2004-08-26
  • 打赏
  • 举报
回复
咋样可以打开很多个啊?请教!!
krqii 2004-08-26
  • 打赏
  • 举报
回复
还是不行,这样打开的还是非模态的,可以打开很多个的:(
hhjjhjhj 2004-08-26
  • 打赏
  • 举报
回复
Dim isShell As Boolean
Private Sub Command2_Click()
Dim shl
Dim fd
If isShell Then Exit Sub
Set shl = CreateObject("Shell.Application")
isShell = True
Set fd = shl.BrowseForFolder(0, "选择文件夹", 0, 0)
If Not fd Is Nothing Then
MsgBox fd.Self.Path
End If
isShell = False
End Sub
yinweihong 2004-08-26
  • 打赏
  • 举报
回复
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)

Private Function BrowseFolder(hwndOwner As Long, sPrompt As String) As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
udtBI.hwndOwner = hwndOwner
udtBI.lpszTitle = lstrcat(sPrompt, "")
udtBI.ulFlags = BIF_RETURNONLYFSDIRS
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then sPath = Left$(sPath, iNull - 1)
End If
BrowseForFolder = sPath
End Function

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧