Jag har problem med en ikon som jag har lagt i system tray. När explorer startar om så försvinner ikonen trots att programmet fortfarande är aktivt. Alla andra program som ligger där har kvar sina ikoner (alla program som jag inte har gjort) så jag antar att det är jag som gör nått fel. Tycker att du har en himla massa kod för en så enkel sak. Jag har kollat ditt exempel men den verkar inte ha stöd för Balloon (vet inte riktigt vad dom heter på svenska... men det är sånna där "XP-ballonger" som kommer upp vid ikonen). Ahha var det så du menade. Nu tror jag inte att du har förstått mig rätt... ballongen jag syftar på är en sån här http://msdn.microsoft.com/msdnmag/issues/02/11/CQA/fig01.gif. Om jag inte missminner mig så har explorer.exe en förmåga att tappa dessa ikoner lite titt som tätt. Efter en snabb titt med reflector på assemblyt System.Windows.Forms.dll å messagehandlern för klassen NotifyIcon (reklam för .net:s inbyggda stöd för notifyicons) så hittade jag att den verkar fånga ett windowsmessage vid namn WM_TASKBARCREATED för att då uppdatera den lilla fula ikonen ;) Anledningen till att de försvinner är att explorer inte uppdaterar systray själv. Detta kan man se om t.ex. explorer hänger sig och startas igen. Då försvinner de flesta ikoner i systrayn. Alla ligger dock kvar, men osynliga, dvs programmet körs fortfarande. Endast de som är aktiva och uppdaterar sig själva kommer synas. Tack vare WM_TASKBARCREATED så lyckades jag hitta ett exempel som kan lösa mitt problem. En länk till det är http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=50753&lngWId=1, har dock inte hunnit testa det själv än. Kan nån testa programmet som jag länkade till? När jag använder koden så stängs hela VB ner så fort man avslutar programmet...Ikon i system tray
På formen har jag en picturebox som tar emot händelsen om man klickar på ikonen.
Koden jag använder:
Form:
<code>
Private Sub Form_Load()
CreateTrayicon Me.Icon, "Mitt program"
End Sub
Private Sub Form_Unload()
DeleteTrayicon
End Sub
</code>
Module:
<code>
Option Explicit
Public Enum BalloonIconEnum
BALLON_NONE = &H0
BALLON_WARNING = &H2
BALLON_ERROR = &H3
BALLON_INFO = &H1
End Enum
Public BalloonExists As Boolean
'Notice the changes here from the old 'standard' NOTIFYICONDATA
Public Type NOTIFYICONDATA
cbSize As Long
hWnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 128
dwState As Long
dwStateMask As Long
szInfo As String * 256
uTimeout As Long
szInfoTitle As String * 64
dwInfoFlags As Long
End Type
Public m_IconData As NOTIFYICONDATA
Public Const NOTIFYICON_VERSION = 3 'V5 style taskbar
Public Const NOTIFYICON_OLDVERSION = 0 'Win95 style taskbar
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const NIM_SETFOCUS = &H3
Public Const NIM_SETVERSION = &H4
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIF_STATE = &H8
Public Const NIF_INFO = &H10
Public Const NIS_HIDDEN = &H1
Public Const NIS_SHAREDICON = &H2
Public Const NIIF_NONE = &H0
Public Const NIIF_WARNING = &H2
Public Const NIIF_ERROR = &H3
Public Const NIIF_INFO = &H1
Public Const NIIF_GUID = &H4
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Declare Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32" _
Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Public Sub CreateBalloon(InfoBallonIcon As BalloonIconEnum, ByVal InfoTitle As String, ByVal InfoText As String)
With m_IconData
.cbSize = Len(m_IconData)
.hWnd = Main.TrayiconDummy.hWnd
.uID = vbNull
.uFlags = NIF_ICON Or NIF_INFO Or NIF_MESSAGE Or NIF_TIP 'NIF_TIP Or NIF_MESSAGE
.uCallbackMessage = WM_MOUSEMOVE
.hIcon = Main.TrayiconDummy.Picture
'.szTip = InfoToolTip & vbNullChar 'Tooltip
'.szTip = .szTip
.dwState = 0
.dwStateMask = 0
.szInfo = InfoText & Chr(0)
.szInfoTitle = InfoTitle & Chr(0)
'.dwInfoFlags = NIIF_INFO
.dwInfoFlags = InfoBallonIcon
.uTimeout = 5000
End With
If BalloonExists = True Then
Shell_NotifyIcon NIM_MODIFY, m_IconData
End If
End Sub
Public Sub CreateTrayicon(IconPic As Picture, ByVal InfoToolTip As String)
With m_IconData
.cbSize = Len(m_IconData)
.hWnd = Main.TrayiconDummy.hWnd
Main.TrayiconDummy.Picture = IconPic
.uID = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallbackMessage = WM_MOUSEMOVE
.hIcon = IconPic
.szTip = InfoToolTip & vbNullChar 'Tooltip
.dwState = 0
.dwStateMask = 0
.szInfo = Chr(0)
.szInfoTitle = Chr(0)
.dwInfoFlags = NIIF_INFO
.uTimeout = 3000
End With
If BalloonExists = False Then
Shell_NotifyIcon NIM_ADD, m_IconData
BalloonExists = True
Else
Shell_NotifyIcon NIM_MODIFY, m_IconData
End If
End Sub
Public Sub DeleteTrayicon()
Shell_NotifyIcon NIM_DELETE, m_IconData
End Sub
</code>
ThomasSv: Ikon i system tray
Kolla mitt uppskick
Programarkivet:Animerad SysTray tror att du kan förenkla mycket genom den koden.Sv:Ikon i system tray
ThomasSv: Ikon i system tray
Då tjyvar du dom från nån iconextractor,dom ligger i Shell32.dll.
Så gör du en ImageList av dessa iconer , sen är det bara att köra som du vill.
Dessa iconer har tydligen association till Explorer.Sv:Ikon i system tray
ThomasSv: Ikon i system tray
Ett förslag är att du testar att köra modify lite då och då. Om den misslyckas så borde det betyda att ikonen inte finns i systray.
Lite då och då vet jag däremot inte vad det betyder...Sv:Ikon i system tray
Hur du nu gör för att fånga meddelanden i vb 6 kommer jag dock inte ihåg :/Sv:Ikon i system tray
/AndrecSv: Ikon i system tray
ThomasSv:Ikon i system tray
Thomas