API应用秘技(17):系统对话框任我用(下)
软件世界
本期看点:用一系列API函数来调用各类“非常规”的系统对话框,包括调用“系统设置改变”对话框和调用“浏览文件夹”对话框等。这些应用不仅免去了繁琐的编写代码过程,也使程序功能大为增强和更为专业化。
本期实例效果
1.调用“系统设置改变”对话框
运行后将调用系统的“设置改变”对话框,如图1所示。如果在你的软件中加入这个功能,便可以实现关机或者重新启动等功能了。
2.调用“浏览文件夹”对话框
这是一个在很多程序中都能看到的界面,功能就不用在这里详细叙述了。运行后调用的系统的“浏览文件夹”对话框,如图2所示。
程序实现方法
调用“系统设置改变”对话框
在使用SHRestartSystemMB 函数调用“系统设置改变”对话框时,须将uFlags 参数设置为4(即重新启动),因此建议通过定义常量来保存该值,此外还需将hOwner参数赋值为调用该对话框的窗体句柄,代码如下所示:
注:先进行API函数①的声明。
'定义系统重新启动常量
Const SystemChangeRestart = 4
'调用“系统设置改变”对话框子程序
Sub ShowSettingsChanged(CallForm As Form, prompt As String)
SHRestartSystemMB CallForm.hwnd, prompt, SystemChangeRestart '参考API函数声明①
End Sub
提示:调用“系统设置改变”对话框的代码如下所示:
ShowSettingsChanged Me, ""
调用“浏览文件夹”对话框
调用“浏览文件夹”对话框首先须通过SHBrowseForFolder调用“浏览文件夹”对话框,然后通过SHGetPathFromIDList函数获取文件夹名称并截取ASCII码字符值为0后的内容,代码如下所示:
注:先进行API函数②③的声明。
'调用“浏览文件夹”对话框子程序
Sub Showdir(title As String)
Dim bi As BROWSEINFO
Dim pidl, rtn, path As String
Dim pos As Integer
'设置结构体的相关参数
With bi
.lpszTitle = title
End With
pidl = SHBrowseForFolder(bi) '参考API函数声明②
path = Space(512)
rtn = SHGetPathFromIDList(ByVal pidl, ByVal path) '参考API函数声明③
If rtn <> "" Then
pos = InStr(path,Chr(0))
MsgBox Left(path,pos - 1)
End If
End Sub
提示:调用“浏览文件夹”对话框的代码如下所示:
Showdir "请选择文件夹:"
相关API函数声明
实现各类系统对话框调用所需的API系列函数名称和功能如下所述:
①SHRestartSystemMB
说明:该函数用于调用“系统设置改变”对话框。
返回值:Long型,如返回非零值,则代表成功。
参数:
hOwner参数:代表调用对话框的对象句柄。
sExtraPrompt参数:代表附加的提示内容,用户可自定义。
uFlags参数:代表操作的类型。
VB声明:Declare Function SHRestartSystemMB Lib "shell32" Alias "#59" (ByVal hOwner As Long, ByVal sExtraPrompt As String, ByVal uFlags As Long) As Long
②SHBrowseForFolder
说明:该函数用于调用“浏览文件夹”对话框。
返回值:Long型,如返回非零值,则代表成功。
参数:
lpBrowseInfo:BROWSEINFO类型,用于设置浏览文件夹的参数,其参数声明和各成员作用如下所述:
Type BROWSEINFO
hOwner As Long '调用对话框的窗体句柄
pidlRoot As Long '通过标志项来设置对话框的根目录位置
pszDisplayName As String '设置接收用户选择文件夹的缓存区域
lpszTitle As String '设置对话框的提示内容,用户可自定义
ulFlags As Long '设置显示的文件夹类型
lpfn As Long '设置接收该对话框事件的函数
lParam As Long '设置该对话框的回调值
iImage As Long '设置选择文件夹的图标
End Type
VB声明:Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
③SHGetPathFromIDList
说明:该函数获取调用“浏览文件夹”对话框中选择的文件夹名称。
返回值:Long型,如返回非零值,则代表成功。
参数:
pidl参数:获取由SHBrowseForFolder函数返回的标志。
pszPath参数:获取用户选择的文件夹。
VB声明:Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long

