请问怎么使用WM_SETICON,帮忙看看代码

kmlxk0 2005-12-04 05:34:05
我想修改其他窗口的图标,可是做不到。

尝试使用SendMessage hwnd,WM_SETICON,Icon_SMALL,hIcon

代码如下

Dim sFileName As String
Dim nIconIdx As Long, hSmallIcon As Long, hLargeIcon As Long
Dim hIcon As Long
sFileName = String(MAX_PATH, 0)
If SHChangeIconDialog(0, sFileName, MAX_PATH, nIconIdx) Then
If IsWindowsNT Then sFileName = StrConv(sFileName, vbFromUnicode)
If ExtractIconEx(sFileName, nIconIdx, hLargeIcon, hSmallIcon, 1) > 0 Then
hIcon = CopyIcon(hSmallIcon)
If hIcon <> 0 Then
Call SendMessage(Val(ListView1(0).SelectedItem.SubItems(1)), WM_SETICON, 0&, hIcon)
End If
End if
End if

帮帮我~
...全文
305 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kmlxk0 2005-12-05
  • 打赏
  • 举报
回复
太感谢了~
如您所说,加了byval就好了~


BTW,好多星星~羡慕~~
rainstormmaster 2005-12-04
  • 打赏
  • 举报
回复
下面是我简单写的一个例子,你可以参考一下:
Option Explicit

Private Const SM_CXICON = 11
Private Const SM_CYICON = 12
Private Const SM_CXSMICON = 49
Private Const SM_CYSMICON = 50
Private Const LR_DEFAULTCOLOR = &H0
Private Const LR_MONOCHROME = &H1
Private Const LR_COLOR = &H2
Private Const LR_COPYRETURNORG = &H4
Private Const LR_COPYDELETEORG = &H8
Private Const LR_LOADFROMFILE = &H10
Private Const LR_LOADTRANSPARENT = &H20
Private Const LR_DEFAULTSIZE = &H40
Private Const LR_VGACOLOR = &H80
Private Const LR_LOADMAP3DCOLORS = &H1000
Private Const LR_CREATEDIBSECTION = &H2000
Private Const LR_COPYFROMRESOURCE = &H4000
Private Const LR_SHARED = &H8000&
Private Const IMAGE_ICON = 1
Private Const WM_SETICON = &H80
Private Const ICON_SMALL = 0
Private Const ICON_BIG = 1
Private Const GW_OWNER = 4
Private Declare Function LoadImageAsString Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal uType As Long, ByVal cxDesired As Long, ByVal cyDesired As Long, ByVal fuLoad As Long) As Long
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Private Sub SetIcon(ByVal hwnd As Long, ByVal sIconFileName As String, Optional ByVal bSetAsAppIcon As Boolean = True)
Dim lhWndTop As Long
Dim lhWnd As Long
Dim cx As Long
Dim cy As Long
Dim hIconLarge As Long
Dim hIconSmall As Long

If (bSetAsAppIcon) Then
' Find VB's hidden parent window:
lhWnd = hwnd
lhWndTop = lhWnd
Do While Not (lhWnd = 0)
lhWnd = GetWindow(lhWnd, GW_OWNER)
If Not (lhWnd = 0) Then
lhWndTop = lhWnd
End If
Loop
End If

cx = GetSystemMetrics(SM_CXICON)
cy = GetSystemMetrics(SM_CYICON)
hIconLarge = LoadImageAsString(App.hInstance, sIconFileName, IMAGE_ICON, cx, cy, LR_LOADFROMFILE)
If (bSetAsAppIcon) Then
SendMessageLong lhWndTop, WM_SETICON, ICON_BIG, hIconLarge
End If
SendMessageLong hwnd, WM_SETICON, ICON_BIG, hIconLarge

cx = GetSystemMetrics(SM_CXSMICON)
cy = GetSystemMetrics(SM_CYSMICON)
hIconSmall = LoadImageAsString(App.hInstance, sIconFileName, IMAGE_ICON, cx, cy, LR_LOADFROMFILE)
If (bSetAsAppIcon) Then
SendMessageLong lhWndTop, WM_SETICON, ICON_SMALL, hIconSmall
End If
SendMessageLong hwnd, WM_SETICON, ICON_SMALL, hIconSmall

End Sub


'修改记事本的图标,当然,你首先要打开记事本
Private Sub Command1_Click()
Dim mhwnd As Long
mhwnd = FindWindow("notepad", vbNullString)
SetIcon mhwnd, "e:\icon\PHONE16.ICO"
End Sub

rainstormmaster 2005-12-04
  • 打赏
  • 举报
回复
你先看一下是否正确的取到了图标的句柄,另外一个需要注意的地方就是sendmessage的lparam参数应该传值,即,如果你没有修改sendmessage的声明的话,应该这样写:
Call SendMessage(Val(ListView1(0).SelectedItem.SubItems(1)), WM_SETICON, 0&,byval hIcon)
kmlxk0 2005-12-04
  • 打赏
  • 举报
回复
暂时~ 就是那种伪装其他窗口的功能。。。 谢谢
rainstormmaster 2005-12-04
  • 打赏
  • 举报
回复
是永久修改还是暂时修改?

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧