回 帖 发 新 帖 刷新版面

主题:偷天换日,win7用自定义图标替代快捷方式上的小箭头(附vb代码)

偷天换日,win7用自定义图标替代快捷方式上的小箭头(附vb代码)


win7桌面快捷方式的图标左下角默认都有一个小箭头,看起来不爽,于是大家纷纷想法子去除这个小箭头。最常用的方法是删除注册表的“IsShortcut”项值。这个项值在注册表中有多处,代表着不同的快捷方式, 如应用程序的快捷方式、DOS的快捷方式、Internet的快捷方式等。我看到此类文章中几乎众口一词地说“IsShortcut”项值用来控制是否显示快捷方式中的小箭头,其实并非如此。“Shortcut”这个英文单词是快捷的意思,而“Is”在VB6中是测试语句的前缀,如:“IsArray”测试变量是否为一个数组,“IsDate”测试一个表达式是否可以转换成日期,等等。所以,“IsShortcut”实际上是测试该图标是否快捷方式。如果删除这个项值,那么系统就不能确定该图标是一个快捷方式,由此可能会造成:不能用超级任务栏、开始菜单游戏打不开、右键“计算机管理”打不开…等等弊病。
系统在显示桌面图标时,如果是快捷方式,采用的是合成图标的方法,就是将文件本身的图标与系统文件SHELL32.dll中的29号图标合起来,而29号图标就是那个臭名昭著的小箭头。SHELL32.dll是系统图标库之一(还有imageres.dll和moricons.dll等),里面集成了306个图标,你可以在任一文件夹上点击右键,然后属性→自定义→更改图标,就可观赏到这个文件中所有的图标。图标从0号开始计数,再从上至下、从左至右排号,可以发现49—52号是空白图标。于是有人想出来完美去除小箭头的办法:修改注册表,用空白图标替代29号图标(见后面的代码),这样就皆大欢喜,既去除了小箭头又无“打不开”之虞。
进一步思索,现在不是追求个性化吗,那么用自定义的图标替代小箭头,不是更有特色吗?想干就干,实验了几次,果然获得了成功!用图标制作软件(推荐“王牌图标大师”,可到163信箱去下载,帐号是:vb62013,密码是:vb620132013)新建一个32像素图标,背景为单一颜色,在左下角11×11(当然也可以为16×16,再大就有点喧宾夺主了)像素范围内绘制图形,把背景色设置为透明色(这一点很重要,否则背景色会覆盖主图标),保存,就可以了。以后你随时可以更换这个图标,而不用修改注册表。
新建一个窗体,画上3个按纽,设置为控件数组,3个按纽的标题分别是:去除小箭头、自定义、恢复小箭头。代码如下:


Option Explicit


Dim ws
Dim st As String, zt As String


Private Sub Form_Load()
Set ws = CreateObject("wscript.shell")
End Sub


Private Sub Command_Click(Index As Integer)
On Error GoTo 100
st = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons\"

Select Case Index
  Case 0
    zt = Environ("SystemRoot") & "\System32\shell32.dll,51" '49-52号图标均为空白,29号图标为小箭头
    ws.regwrite st & "29", zt '新建“Shell Icons”子键和“29”项值,并写入zt数据
  Case 1
    zt = "F:\图标库\100.ico" '自定义图标的全路径文件名
    ws.regwrite st & "29", zt
  Case 2
    ws.regDelete st '删除“Shell Icons”子键
End Select

MsgBox "操作成功!"
100
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set ws = Nothing
End Sub


提示:本代码在32位win7旗舰版通过,操作以后要注销或重启才能生效。

回复列表 (共2个回复)

沙发

稍微改动了一下,本想直接改我发的文章,不料居然跳出提示说我“没有修改的权限”,真是哭笑不得。


win7桌面快捷方式的图标左下角默认都有一个小箭头,看起来不爽,于是大家纷纷想法子去除这个小箭头。最常用的方法是删除注册表的“IsShortcut”项值。这个项值在注册表中有多处,代表着不同的快捷方式, 如应用程序的快捷方式、DOS的快捷方式、Internet的快捷方式等。我看到此类文章中几乎众口一词地说“IsShortcut”项值用来控制是否显示快捷方式中的小箭头,No,No,No,此言大谬,小箭头难道会从天而降吗?肯定是是存在于某个文件之中。“Shortcut”这个英文单词是快捷的意思,而“Is”在VB6中是测试语句的前缀,如:“IsArray”测试变量是否为一个数组,“IsDate”测试一个表达式是否可以转换成日期,等等。所以,“IsShortcut”实际上是测试该图标是否快捷方式。
桌面图标显示原理是(分两步):
第一步,判断是否快捷方式:显示图标的时候,系统先到注册表中查找该类型图标的“IsShortcut”项值,没找到,说明不是快捷方式,就直接显示文件本身的图标,不进行第二步;找到了,就认为这是个快捷图标,再进行第二步。
第二步,合成图标:到注册表有关位置查找“Shell Icons”子键和“29”项值,如果找不到,就默认从系统文件SHELL32.dll中提取29号图标与主图标进行合成后再显示出来,29号图标就是那个臭名昭著的小箭头;如果找到了,就根据“29”提供的位址提取图标与主图标进行合成。
如果删除“IsShortcut”项值,那么系统认为要显示的图标不是快捷方式,就不会采用合成图标的方式,小箭头当然也不会显示出来了。但由此可能会造成:图标不能落在任务栏、右键“计算机管理”打不开、开始菜单游戏打不开……等等弊病。
SHELL32.dll是系统图标库之一(还有imageres.dll和moricons.dll等),里面集成了306个图标,你可以在任一文件夹上点击右键,然后属性→自定义→更改图标,就可观赏到这个文件中所有的图标。图标从0号开始计数,再从上至下、从左至右排号。可以发现49—52号是空白图标。于是有人想出来完美去除小箭头的办法:修改注册表,用空白图标替代29号图标(见后面的代码),这样就皆大欢喜,既去除了小箭头又无“打不开”之虞,还有一个好处:只要修改一处注册表即可,而删除“IsShortcut”要修改注册表多处。
进一步思索,现在不是追求个性化吗,那么用自定义的图标替代小箭头,不是更有特色吗?想干就干,实验了几次,果然获得了成功!用图标制作软件(推荐“王牌图标大师”,可到163信箱去下载,帐号是:vb62013,密码是:vb620132013)新建一个32像素图标,背景为单一颜色,在左下角11×11像素(当然也可以为16×16像素,再大就有点喧宾夺主了)范围内绘制图形,把背景色设置为透明色(这一点很重要,否则背景色会遮掩主图标),保存,再在注册表的“29”项值中调用这个图标就可以了。以后你随时可以更新这个图标,而不用修改注册表。
新建一个窗体,画上3个按纽,设置为控件数组,3个按纽的标题分别是:去除小箭头、自定义、恢复小箭头。代码如下:


Private Sub Command_Click(Index As Integer)
On Error GoTo 100
Dim ws
Dim st As String, zt As String
Set ws = CreateObject("wscript.shell")
st = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons\"


Select Case Index
  Case 0
    zt = Environ("SystemRoot") & "\System32\shell32.dll,51" '49-52号图标均为空白,29号图标为小箭头
    ws.regwrite st & "29", zt '新建“Shell Icons”子键和“29”项值,并写入zt数据
  Case 1
    zt = "F:\图标库\100.ico" '自定义图标的全路径文件名
    ws.regwrite st & "29", zt
  Case 2
    ws.regDelete st '删除“Shell Icons”子键
End Select


MsgBox "操作成功!"
100
Set ws = Nothing
End Sub

板凳

哇 ,还记得当时去163创建的这个专门用来共享文件的邮箱,感慨万千。

我来回复

您尚未登录,请登录后再回复。点此登录或注册