Newsgroup: it.comp.lang.visual-basic
Titolo: Queste icone nella system tray !!! [ MOLTO LUNGO . ]

ciao a tutti,
ho un problema nel gestire una icona nella system tray.
Allora, nel mio progetto, ho un modulo di classe nel quale ho inserito
queste dichiarazioni :
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias
"Shell_NotifyIconA" _
(ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public 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
Public Const GWL_WNDPROC = (-4&)
Public Const NIM_ADD = &H0&
Public Const NIM_MODIFY = &H1&
Public Const NIM_DELETE = &H2&
Public Const NIF_MESSAGE = &H1&
Public Const NIF_ICON = &H2&
Public Const NIF_TIP = &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 Const UM_SYSTRAY = &H1000&
Public lProcOld As Long
Public typeNOTIFYICONDATA As NOTIFYICONDATA
Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
    If iMsg = UM_SYSTRAY Then
        Select Case lParam
            Case WM_MOUSEMOVE
                'movimento del mouse sull'icona
            Case WM_LBUTTONDOWN
                'pressione del tasto sx del mouse sull'icona
            Case WM_LBUTTONUP
               'rilascio del tasto sx del mouse sull'icona
            Case WM_LBUTTONDBLCLK
                'doppio click con il tasto sx del mouse sull'icona
            Case WM_RBUTTONDOWN
                'pressione del tasto dx del mouse sull'icona
            Case WM_RBUTTONUP
                'rilascio del tasto dx del mouse sull'icona
            Case WM_RBUTTONDBLCLK
                'doppio click con il tasto dx del mouse sull'icona
        End Select
    End If
    WindowProc = CallWindowProc(lProcOld, hWnd, iMsg, wParam, lParam)
End Function
---------------------------------------------------end----
OK !?! dopodichè nel mio form_main, ho inserito il codice x l'inserimento
dell'icona nella tray, che funziona benissimo.Il problema, è che quando
chiudo il programma, vorrei eliminare dalla tray la mia icona, quindi nella
sub "form_unload" ho inserito il seguente codice :
---------------start----------------------------
lProcOld = SetWindowLong(Me.hWnd, GWL_WNDPROC, _
 AddressOf WindowProc)
Shell_NotifyIcon NIM_DELETE, typeNOTIFYICONDATA
-------------------end--------------
che in effetti mi elimina l'icona, pero' dopo aver scaricato il form_main
(ho fatto un debug), torna in ciclo (fino al collassamento dello stack) alla
funzione :
--------------------------------------------------
Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
...
che ho elencato sopra, generando un errore nel kernel !
Cosa puo' essere ? Dove sbaglio ?! Oltretutto, il codice d'esempio x gestire
le icone nella tray, l'ho preso dal sito di Sirri Moreno, indicato sul sito
dell ng.
grazie a tutti e scusate x la lunghezza.
Trickballante .

ho guardato un progetto che usa la tray icon e nella queryunload fa una
chiamata simile alla tua, quindi il problema probabilmente non e' la
chiamata ma qualcos'altro....
io ti posso consigliare di guardare a questo link..
http://www.vbaccelerator.com/codelib/shell/systray.htm
e confrontare l'esempio di steve con quello che hai scritto tu
ciao
--
Alessio aka CiRcLeMaster
CiRcLe is a VB Open Source IRC Client
(
http://ref.sign.circle.serveirc.com/circle
)

 ...
penso che il problema derivi dal fatto che devi restituire il controllo
della messagistica al processo originario prima di scaricarlo, quindi come
ultima istruzione dovresti inserire:
SetWindowLong Me.hWnd, GWL_WNDPROC, lProcOld
che ripristina il processo origine.
beppe

 !... Ma quale !? è una funzione che proprio non ho capito .
Male :)
Bisogna capire cosa si usa.
La SetWindowLong() nel tuo caso serve per settare la WindowProc() (cioè la
funzione che si occupa di processare e smistare i messaggi di windows -
leggi "eventi") per il tuo processo.
Se non ripristini la vecchia (cioè quella che VB crea di default) prima di
uscire dal programma il crash è assicurato.
Tu puoi evitare questo con un semplice trucchetto: usare ad es. una
picturebox nascosta che intercetti per te i messaggi (tramite la WindowProc
di default), settando la funzione di callback (il messaggio) su WM_MOUSEMOVE
e l'hWnd ricevente quello della picturebox.
In questo modo a te basta piazzarti nella Picture_MouseMove() e gestire i
parametri relativi.
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"