Newsgroup: it.comp.lang.visual-basic
Titolo: API per system tray

Qualcuno mi può indicare qual'è la API da utilizzare per inserire un
programma VB4 nella system tray?
	Sarebbe gradito anche un esempio.
				Franco
--
Automatic posted from 
ro...@edy.ivg.it
 [194.184.152.232]
via Mailgate Server - 
http://www.mailgate.org

...


La funzione si chiama ShellNotifyIcon.
Private Declare Function ShellNotifyIcon Lib "shell32.dll" Alias
"Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As
Long
Questa funzione, come potete notare richiede una struttura di tipo
NOTIFYICONDATA che e’ cosí definita:
Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
I vari elementi della struttura determinano le caratteristiche dell’icona
presente nella TrayBar.
CbSize Lunghezza della struttura
HWnd Handle della finestra che riceverá i messaggi relativi alla nostra
icona.
UID WParam custom
Uflags Flags utilizzati per informare il tipo di operazione desiderato alla
funzione ShellNotifyIcon
UcallbackMessage Numero del Messaggio (Custom)
Hicon Handle dell’icona che vogliamo visualizzare
SzTip Tooltip relativo alla nostra icona
Il parametro flags puó essere l’OR di queste costanti:
NIF_ICON = &H2
NIF_MESSAGE = &H1
NIF_TIP = &H4
NIM_ADD = &H0
NIM_DELETE = &H2
NIM_MODIFY = &H1
Una nota particolare meritano i parametri uID e uCallBackMessage.
Una volta che la nostra icona è nella SysTray, Windows manda alla window
procedure della finestra indicata dal parametro hWnd,il messaggio
uCallBackMessage,con i vari parametri impostati in questo modo:wParam=uID e
lParam=Messaggi realtivi al mouse (es.WM_MOUSEMOVE,WM_LBUTTONDOWN…)
Discriminando questi valori è possibile gestire i vari click,dblclkick dell’
utente sulla nostra icona.
È ovvio che tutto questo richiede il subclassing della finestra indicata in
hWnd (mediante AddressOf), esiste peró una soluzione molto piú veloce (anche
se meno pulita).
Non utilizzate un vostro messaggio custom,ma fissate uID=vbNull e utilizzate
come uCallBackMessage=WM_MOUSEMOVE, in questo modo, la vostra finestra, (che
potrebbe essere un form) appena il mouse si muoverá sopra la vostra
icona,riceverá un messaggio WM_MOUSEMOVE;utilizzando il paramentro X che VB
passa all’evento MouseMove,potete discriminare i vari messaggi del mouse
(es.WM_MOUSEMOVE,WM_LBUTTONDOWN…) e regolarvi di conseguenza.
Ok,un poco di codice…
…
Dim myStruct as NOTIFYICONDATA
With myStruct
.cbSize = Len(myStruct)
.uID = vbNull
.uFlags = NIF_MESSAGE Or NIF_TIP Or NIF_ICON
.hIcon = Form1.Icon
.szTip = "Custom Tooltip" & Chr$(0)
.hwnd = Form1.hwnd
.uCallbackMessage = WM_MOUSEMOVE
End With
ShellNotifyIcon NIM_ADD, muShNotify
Ricordatevi di rimuovere la vostra icona quando terminate il programma nel
seguente modo:
ShellNotifyIcon NIM_DELETE, muShNotify
Nota: Non modificate gli elementi della struttura.
Se volete aggiornare a run time la vostra icona,modificate il parametro
hIcon della struttura e utilizzate ShellNotifyIcon in ‘modalitá’
aggiornamento:
MyStruct.Icon = Form2.Icon
ShellNotifyIcon NIM_MODIFY, muShNotify
Per gestire i vari messaggi inviati dall’icona,supponendo di avere
utilizzato un generico Form1 come destinatario dei vari messaggi,
utilizzando il metodo ‘Lazy’ non dovete far altro che gestire i vari
messaggi MouseMove che Windows vi invierá non appena muovete il mouse sopra
l’icona o vi cliccate sopra.
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Select Case X
Case 7770: Debug.Print "Right DblClick"
Case 7680: Debug.Print "MouseMove"
Case 7725: Debug.Print "Left DblClick"
Case 7695: Debug.Print "Left MouseDown"
Case 7755: Debug.Print "Right MouseUp"
Case 7710: Debug.Print "Left MouseUp"
Case 7740: Debug.Print "Right MouseDown"
End Select
End Sub
Gestendo, ad esempio, il messaggio 7725, potete far apparire Form1 quando l’
utente fa doppio click sulla vostra icona.
Ti consiglio di wrappare tutto all’interno di una classe, in modo da poter
riutilizzare il codice quando necessario.
Ciao
Corrado


...
