先说下想实现的功能,一个小程序,可以实现更改桌面某快捷方式图标。
我已经做了一些测试:如下
Private Sub fnShellLinkObjectSetIconLocationVB()
Dim objShell As Shell32.Shell
Dim objFolder As Shell32.Folder Set objShell = New Shell
Set objFolder = objShell.NameSpace(ssfPROGRAMS)
If (Not objFolder Is Nothing) Then
Dim objFolderItem As FolderItem Set objFolderItem = objFolder.ParseName("Internet Explorer.lnk")
If (Not objFolderItem Is Nothing) Then
Dim objShellLink As ShellLinkObject Set objShellLink = objFolderItem.GetLink
If (Not objShellLink Is Nothing) Then
objShellLink.SetIconLocation objShellLink.path, 1
objShellLink.Save
End If
Set objShellLink = Nothing
End If
Set objFolderItem = Nothing
End If
Set objFolder = Nothing
Set objShell = Nothing
End Sub 但在
objShellLink.SetIconLocation objShellLink.path, 1
,即方法SetIconLocation(bs As String, iIcon As Long)时,必须提供一个iIcon,这个iIcon好像只能是快捷方式已有的,或者操作系统的一些,而不能是我自己的。 如何实现提供一个ICON文件的路径,将快捷方式的图标改称这个??
或者改称我的小程序的图标,这样会不会容易些?另外如果可以更改应用程序的图标,也请赐教阿,狂加分。附:我知道右键点击可以更改,但我想代码里实现这个功能。
我已经做了一些测试:如下
Private Sub fnShellLinkObjectSetIconLocationVB()
Dim objShell As Shell32.Shell
Dim objFolder As Shell32.Folder Set objShell = New Shell
Set objFolder = objShell.NameSpace(ssfPROGRAMS)
If (Not objFolder Is Nothing) Then
Dim objFolderItem As FolderItem Set objFolderItem = objFolder.ParseName("Internet Explorer.lnk")
If (Not objFolderItem Is Nothing) Then
Dim objShellLink As ShellLinkObject Set objShellLink = objFolderItem.GetLink
If (Not objShellLink Is Nothing) Then
objShellLink.SetIconLocation objShellLink.path, 1
objShellLink.Save
End If
Set objShellLink = Nothing
End If
Set objFolderItem = Nothing
End If
Set objFolder = Nothing
Set objShell = Nothing
End Sub 但在
objShellLink.SetIconLocation objShellLink.path, 1
,即方法SetIconLocation(bs As String, iIcon As Long)时,必须提供一个iIcon,这个iIcon好像只能是快捷方式已有的,或者操作系统的一些,而不能是我自己的。 如何实现提供一个ICON文件的路径,将快捷方式的图标改称这个??
或者改称我的小程序的图标,这样会不会容易些?另外如果可以更改应用程序的图标,也请赐教阿,狂加分。附:我知道右键点击可以更改,但我想代码里实现这个功能。
测试的话,调用: mShellLnk "TestLnk","mspaint.exe","C:\windows\","notepad.exe"
过分了啊修改EXE图标要修改PE文件滴,豆子貌似有现成源码。
[email protected]
谢谢
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Private Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetLastError Lib "kernel32" () As LongPrivate Const INVALID_HANDLE_VALUE = -1
Private Const GENERIC_READ = &H80000000
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_BEGIN = 0
Private Const OPEN_EXISTING = 3
Private Const RT_ICON = 3&
Private Const DIFFERENCE As Long = 11
Private Const RT_GROUP_ICON As Long = (RT_ICON + DIFFERENCE)Private Type ICONDIRENTRY
bWidth As Byte
bHeight As Byte
bColorCount As Byte
bReserved As Byte
wPlanes As Integer
wBitCount As Integer
dwBytesInRes As Long
dwImageOffset As Long
End TypePrivate Type ICONDIR
idReserved As Integer
idType As Integer
idCount As Integer
'idEntries As ICONDIRENTRY
End TypePrivate Type GRPICONDIRENTRY
bWidth As Byte
bHeight As Byte
bColorCount As Byte
bReserved As Byte
wPlanes As Integer
wBitCount As Integer
dwBytesInRes As Long
nID As Integer
End TypePrivate Type GRPICONDIR
idReserved As Integer
idType As Integer
idCount As Integer
idEntries As GRPICONDIRENTRY
End Type
'//////////////////////////////////////////////
'//函数说明:修改EXE图标
'//
'//参 数:IconFile 图标文件
'// ExeFile 被修改的EXE文件
'//
'//返回值: 成功为True,否则False
'/////////////////////////////////////////////////////
Private Function ChangeExeIcon(ByVal IconFile As String, ByVal ExeFile As String) As Boolean
On Error GoTo cw
Dim stID As ICONDIR
Dim stIDE As ICONDIRENTRY
Dim stGID As GRPICONDIR
Dim hFile As Long
Dim pIcon() As Byte, pGrpIcon() As Byte
Dim nSize As Long, nGSize As Long
Dim dwReserved As Long
Dim hUpdate As Long
Dim ret As Long
hFile = CreateFile(IconFile, GENERIC_READ, 0, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hFile = INVALID_HANDLE_VALUE Then Exit Function ret = ReadFile(hFile, stID, Len(stID), dwReserved, ByVal 0&)
If ret = 0 Then GoTo cw
ret = ReadFile(hFile, stIDE, Len(stIDE), dwReserved, ByVal 0&) nSize = stIDE.dwBytesInRes
ReDim pIcon(nSize - 1)
SetFilePointer hFile, stIDE.dwImageOffset, ByVal 0&, FILE_BEGIN
ret = ReadFile(hFile, pIcon(0), nSize, dwReserved, ByVal 0&)
If ret = 0 Then GoTo cw
With stGID
.idType = 1
.idCount = stID.idCount
.idReserved = 0
CopyMemory stGID.idEntries, stIDE, 12
.idEntries.nID = 0
End With
nGSize = Len(stGID)
ReDim pGrpIcon(nGSize - 1)
CopyMemory pGrpIcon(0), stGID, nGSize
hUpdate = BeginUpdateResource(ExeFile, False)
ret = UpdateResource(hUpdate, RT_GROUP_ICON, 1, 0, pGrpIcon(0), nGSize)
ret = UpdateResource(hUpdate, RT_ICON, 1, 0, pIcon(0), nSize)
EndUpdateResource hUpdate, False If ret = 0 Then GoTo cw
ChangeExeIcon = True
cw:
CloseHandle hFile
End Functio调用:Call ChangeExeIcon("D:\temp\123.ico", "D:\temp\123.exe")转自:http://hi.baidu.com/cxwr/blog/item/9d7f53387efe5af1b211c780.html来吧~~~我不会嫌分多的~~~:)