Newsgroup: it.comp.lang.visual-basic
Titolo: problema shell_notifyicon (codice)

Avevo già postato qualche giorno fa e ringrazio nuovamente le persone che mi
hanno risposto.
Purtroppo però neanche con le loro risposte non sono riuscito a risolvere il
problema.
Riassumo: metto un'icona nella shell con un menu. Se scrivo unload form1
nella routine dell'evento menu_click va in crash tutto. Se premo la "X del
form però è tutto apposto.
Se mi fate un grandissimo favore a provare il codice, è questo:
create un menu di nome "a" con un sottomenu di nome "a1".
 sul modulo del form poi scrivete:
Option Explicit
Private ris As Long
Public Sub mostramenu()
Call SetForegroundWindow(Form1.hWnd)
PopupMenu a
Call SetForegroundWindow(Form1.hWnd)
End Sub
Private Sub a1_Click()
Unload Form1
End Sub
Private Sub Form_Load()
icona.cbSize = Len(icona)
icona.hIcon = Form1.Icon
icona.hWnd = Form1.hWnd
icona.szTip = "Icona di prova" & vbNullChar
icona.ucallbackMessage = mytray_message
icona.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP
ris = Shell_NotifyIcon(NIM_ADD, icona)
hprecedente = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf IntercettaMsg)
End Sub
Private Sub Form_Unload(Cancel As Integer)
ris = SetWindowLong(hWnd, GWL_WNDPROC, hprecedente)
ris = Shell_NotifyIcon(NIM_DELETE, icona)
End Sub
'*************
poi su un modulo bas:
Option Explicit
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 icona As NOTIFYICONDATA
Public hprecedente As Long
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 GWL_WNDPROC = (-4)
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_RBUTTONUP = &H205
Public Const mytray_message = &H501&
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias
"Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As
Boolean
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA"
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam
As Long) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As
Long) As Long
Public 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 Function IntercettaMsg(ByVal hWnd As Long, ByVal Msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
If Msg = mytray_message Then
Select Case lParam
Case WM_RBUTTONUP:
  Call Form1.mostramenu
Case Else
  Call DefWindowProc(hWnd, Msg, wParam, lParam)
End Select
End If
IntercettaMsg = CallWindowProc(hprecedente, hWnd, Msg, wParam, lParam)
End Function
E' tutto. Cosa sbaglio?
Se fate click con il dx sull'icona e poi premete sul sottomenu va in crash
tutto.
Grazie mille per le persone che avranno la pazienza di provare il codice e
di rispondermi.
Ciao ciao,
Alex
--
------------------
email: el_co...@TOGLIQUESTOlibero.it
icq: 132581870
------------------





Chiedo scusa per il triplo post ma outlook fa i capricci...

 Chiedo scusa per il triplo post ma outlook fa i capricci...
[CITE]
Microsoft Outlook: il primo news reader con supporto messaggistica RAID 1.
Leonardo Serni
[/CITE]
Bye, G.

io l'ho provato e il problema è nella roiutine a1_click
il secondo SetForegroundWindow ricarica l'oggetto form1 e riesegue tutto il
codice dell'evento load
per risolvere basta che elimini il secondo  SetForegroundWindow
a me funge anche senza il primo ... ma non so perchè l'avevi messo
ciao
L2K

 a me funge anche senza il primo ... ma non so perchč l'avevi messo
Grazie mille!!!!!
Riporto un frammento dell'articolo sulla traybar che ho trovato sul sito
comune:
"Si noti nel codice la chiamata al'API Win32 SetForegroundWindow, prima e
dopo quella a PopUpMenu. Questo deve essere fatto a causa di un bug di
Windows. In mancanza, il menu rimarrebbe semi-invisibile una volta che si e'
fatto click al di fuori di esso (scomparira' definitivamente solo quando il
mouse vi ripassera' sopra)."
Io l'ho messo prima e dopo quindi, seguendo le indicazioni date.
In ogni caso ti ringrazio ancora.
Ciao ciao,
Alex


si è vero in effetti però tu comandi l'uscita dal programma e quindi non
serve il 2o SetForegroundWindow... servirebbe solo nel caso in cui facessi
altro...
quando aggiungi altri menu o metti una variabile a livello modulo e
controlli il valore o se no te ne sbatti (come ho sempre fatto io) e lo
lasci senza...
 :)
ciao
L2K