与以前的Windows相比,Win2K/XP的用户界面作了不少改进,极大地方便了用户使用Windows。例如,“活动桌面”以HTML为基础,对于Windows NT 4.0用户来说,这是一次巨大的变化。不管你是否喜欢它,新的用户界面为有经验的用户带来了定制桌面的机会,使人们能够更高效地完成日常工作。“打开”对话框属于最常用的对话框之一,在Win 2K/XP的用户界面中,它增加了一个“位置条”,本文要讨论的就是如何定制这个位置条。
本文
的说明主要针对Win 2K,但基本原理同样适用于XP,不同之处会另行指出。
一、“打开”对话框
也许你已经注意到,一些软件在Win2K/XP下运行时,它们的“打开”对话框与Win9x/NT 4.0下有所不同。图一显示了标准的Win2K“打开”对话框,点击记事本的“文件/打开”菜单即可显示出这个对话框。与以前的操作系统相比,这个对话框新增了一样东西:窗口的左边增加了一个垂直的按钮条。Win2K的SDK文档把这个按钮条称作“位置条”(Places Bar)。
图一:标准的Win2K“打开”对话框
位置条的作用是让用户只用一次鼠标点击就可以到达经常使用的文件夹。Win2K/XP位置条包含的按钮最多5个,每个按钮指向一个系统文件夹。点击任意一个按钮,“打开”对话框就会立即显示出对应文件夹的内容。
默认的位置条分别为下列文件夹各提供一个按钮:历史,桌面,我的文档,我的电脑,网上邻居。“历史”文件夹记录了用户最近使用的文件和文件夹,如果要访问最近用过的文件或文件夹,“历史”文件夹是首先要查看的地方。许多用户还经常要用到其他四个文件夹。
默认的位置条配置包含了大多数用户最常用的文件夹,满足了大部分用户的需要。然而,这个默认配置可能不符合你的工作习惯,这时你就要对它进行定制了。
二、定制位置条
无论是注册表还是其他什么地方,都没有明确地列出位置条的各个文件夹。因此,除非手工或用程序自动创建一组新的位置,否则,Win2K/XP总是使用标准的位置条。
位置条是一种系统级的资源。一旦把一组位置指定给位置条,所有的Win2K/XP软件都将使用这组位置。这种限制意味着,你不能为记事本的位置条指定一种配置,又为画笔的位置条指定另一种配置,所有在Win2K/XP下运行的程序共享同一组位置――不管这组位置是标准的还是定制的。(Office例外,它可以有一组不同的位置,稍后再详细讨论)。
要为位置条指定一组新的文件夹,第一步是要告诉系统你不准备再用默认的5个位置。创建HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\ComDlg32\Placesbar注册表子键(一般地,Plicies子键可能已经存在,但ComDlg32子键需要自己创建)。创建该子键之后,你可以看到“打开”对话框的位置条已经变成空白了。Placesbar子键告诉Win2K你不想使用标准的位置组合,但这时你尚未指定自己的配置。
Placesbar子键包含的注册项最多5个,名字从Place0到Place4。Win2K/XP不会认可或正确处理Place5、Place6或其他名字的注册键。位置应当顺序指定,例如,不能设置Place0、Place2漏掉Place1。如果注册表设置的位置既凌乱又不完整,位置条将以不可预知的顺序显示图标和文件夹名字。
在Placesbar子键中添加位置信息时,指定文件夹的方式是以字符串的形式提供文件夹的完整路径名。注册数据的类型是REG_SZ(如果文件夹的名字中用到了环境变量,则应该是REG_EXPAND_SZ)。
可以在注册信息中指定系统文件夹作为位置条上的位置。系统文件夹往往有很长的路径,不容易记住(例如,你能够立即说出“我的文档”的完整路径吗?)如果要把“我的文档”或“收藏”指定为位置,你可以使用与具体系统无关的数字ID,而不是使用它的完整路径名。Microsoft把这个ID称为CSIDL。表一列出了Win2K常见系统文件夹的ID。对于这类文件夹,你可以在Placesbar子键下创建类型为REG_DWORD的注册项并指定ID。
注意:表一的ID值不适用于XP。如果你使用的是XP,请查找相关资料,或直接使用文件夹的绝对路径。
三、定制过程自动化
下面介绍一个modifyPlaces.vbs脚本,这是一个自动读取和写入位置信息的程序。在Win2K命令窗口下,执行“CScript modifyPlaces.vbs”或“WScript modifyPlaces.vbs”即可启动该程序,参见图二。程序首先询问你想要修改的位置编号。如果输入0到4之间的数字,程序继续,点击“是”用路径指定文件夹,点击“否”用ID数字指定文件夹。点击“是”之后,程序要求你输入一个完整的路径名,完成后,程序将创建一个REG_SZ注册键。如果选择了“否”,程序要求输入一个系统文件夹ID,完成后,程序创建一个REG_DWORD子键。指定一个位置之后,程序允许你继续指定其他的位置。
图二:定制位置条
' 常量
const APP_TITLE = "设置“打开”对话框的位置条"
const REG_PLACESBAR = "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\ComDlg32\Placesbar\"
Dim place
' 位置编号
Dim canContinue
' 逻辑开关
' 获取待设置的位置编号
canContinue = True
While canContinue
place = InputBox("输入位置编号 (0到4)", APP_TITLE, 0)
' 点击了“取消”按钮...
If place = "" Then
WScript.Quit
End If
If place 4 Then
MsgBox "位置编号错误,请指定0-4之间的位置编号!", 16, APP_TITLE
Else
' 位置编号合法,从注册表读取信息
ChangePlace place
End If
Wend
' 修改指定的位置
Sub ChangePlace (place)
Dim shell, curPath, buf, rc, newPath, theType
Set shell = CreateObject("WScript.Shell")
On Error Resume Next
curPath = shell.RegRead(REG_PLACESBAR & "Place" & place)
On Error Goto 0
' 默认值
If curPath = "" Then curPath = "默认值"
buf = ""
buf = buf & "位置" & place & "当前被设置为" & _
Chr(34) & curPath & Chr(34) & vbCrLf & vbCrLf & _
"点击“是”指定一个普通文件夹" & vbCrLf & _
"点击“否”指定一个系统文件夹" & vbCrLf & _
"点击“取消”退出程序"
rc = MsgBox(buf, 3, APP_TITLE)
' YES=6, NO=7, CANCEL=2
If rc = vbCancel Then Exit Sub
' 修改位置
Select Case rc
Case vbYes
newPath = InputBox("输入新的文件夹路径", APP_TITLE, curPath)
If newPath = "" Then Exit Sub
theType = "REG_SZ"
Case vbNo
buf = ""
buf = buf & "选择新的文件夹." & vbCrLf & vbCrLf & _
"5 - 我的文档" & vbCrLf & _
"6 - 收藏" & vbCrLf & _
"17 - 我的电脑" & vbCrLf & _
"18 - 网上邻居" & vbCrLf & _
"36 - Windows系统目录" & vbCrLf & _
"34 - 历史"
newPath = InputBox(buf, APP_TITLE, curPath)
If newPath = "" Then Exit Sub
theType = "REG_DWORD"
End Select
shell.RegWrite REG_PLACESBAR & "Place" & place, newPath, theType
End Sub
应该承认,modifyPlaces.vbs没有太多的错误控制机制,而且它的用户界面也很粗糙。如果你想要一个专业一点的程序,最好把它转换成VB代码。图三显示了把“c:\test\”、“我的电脑”指定为位置条上两个位置后的“打开”对话框。
图三:经过定制的“打开”对话框
下面是SetDefaultPlaces.vbs脚本,该程序删除Placesbar子键,恢复默认的位置条设置。如前所述,除非我们创建了Placesbar子键,否则它是不存在的。如果Win2K/XP找不到Placesbar子键,位置条将默认使用标准配置。
' 常量
const APP_TITLE = "恢复“打开”对话框的位置条"
const REG_PLACESBAR = "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\ComDlg32\Placesbar\"
' 是否继续?
rc = MsgBox("点击“确定”恢复标准的位置条配置", 1, APP_TITLE)
If rc < 1 Then
WScript.Quit
End If
' 删除Policies\ComDlg32下的所有注册键,启用标准的位置条配置
Set shell = CreateObject("WScript.Shell")
On Error Resume Next
shell.RegDelete(REG_PLACESBAR)
' 完成...
MsgBox "已经恢复默认的位置