深入改造Win2000“位置条”
发布时间:2006-10-14 3:14:03   收集提供:gaoqian

  与以前的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。

表一:Win2K系统文件夹及其ID 
文件夹  ID 
字体  20 
回收站  10 
我的电脑  17 
网络和拨号连接  49 
打印机  4 
收藏  6 
发送到  9 
My Pictures  39 
历史  34 
网上邻居  18 
我的文档  5 
Windows系统目录  36 


  注意:表一的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 "已经恢复默认的位置条配置", , APP_TITL
 


  四、Office的位置条

  前面的注册表修改只影响那些使用Win2K/XP公用对话框代码库的程序,Office使用的对话框来自一个经过定制的代码库。因此,修改Win2K/XP“打开”对话框的位置条不会对Word和Excel的位置条产生任何影响。

  但是,Office 2000也提供了定制其位置条的办法,相关的注册键是HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Common\Open Find\Places;对于Office XP,注册键路径是HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Common\Open Find\Places\UserDefinedPlaces。

  不过,如果你只是想要定制位置条,可以不通过该注册键。Microsoft提供了一个方便的修改位置条的工具,你可以把它安装到Office 2000软件的“工具”菜单。这个工具可以从http://support.microsoft.com/support/kb/articles/q260/1/90.asp下载,下载包带有该插件的完整VB源代码和如何使用该工具的说明。

  下载places.exe文件之后,双击解开压缩包。然后,点击Win2K/XP的“开始/运行”菜单,输入“regsvr32 <路径>\places.dll”,并确认注册places.dll。此时如果你打开了Office 2000的程序,请先关闭它再打开。这时,Office软件的“工具”菜单上会出现一个“Set Places”菜单项,你可以用它来设置位置条上的各个位置。与Win2K的标准对话框不同,Office 2000软件的位置条支持小图标。使用小图标时,位置条上的文件夹数量不再有最多5个的限制。无论在哪一个Office 2000软件中修改位置条,改动结果将对所有Office 2000软件有效。

  位置条是一种很不错的工具,但只有当它列出的位置恰好是你常用的文件夹时,它的优势才能充分发挥出来。有了本文的知识,现在你也应该能够随心所欲地定制Win2K/XP和Office的位置条了。

 

 

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50