Newsgroup: it.comp.lang.visual-basic
Titolo: Applicazione gestita su icona nel system tray (tipo ICQ!)

Si può fare in vb6 una cosa del genere?
cioè! icona sulla system tray che col tasto dx elenca una serie di menu!
come si fa????
Grazie!
-- 
---
(¯`·.¸ZIO MANGLER¸.·´¯)®
---

 Grazie!
http://vbnet.mvps.org
clicca su Code Library --> Subclassing , scendi fino in fondo alla pagina e
scegli "Manipulating System Tray Icons using Shell_NotifyIcon"
Ciao

 scegli "Manipulating System Tray Icons using Shell_NotifyIcon"
In realtà non serve nemmeno il subclassing: io la usavo già con VB4 che non
aveva l'AddressOf
Basta dare il WM_MOUSEMOVE come messaggio di callback e mettersi nella
MouseMove del form di supporto dell'icona.
Con un select case su X e Y leggendoli come i parametri della
WindowProcedure() (guarda caso il prototipo della MouseMove è molto simile a
quello della WindowProc)
Ciao
--
Math Parser : 
http://www.neodatatype.net
FlowChart   : 
http://www.neodatatype.net/dump/flowchart/dir.asp
Sito Comune : 
http://www.it-lang-vb.net

 quello della WindowProc)
Ecco, qua mi inserisco anche io, perchč mi interessa.
Uso appunto il WM_MouseMove come messaggio intercettato per 'fare
qualcosa' (ad esempio tornare in primo piano).
Una volta per errore avevo messo un controllo in alto a sinistra nella
form, per cui il mousmove non avveniva mai (visto che la parte di form
che risulta 'mousabile' nella tray č di pochi twips).
Lasciando qualche twip libero tutto Ok.
Poi perň, nella form, ho inserito un menů.
Quello che succede, adesso, e non so come venirne fuori, č che con
sistemi con 640x480 e caratteri grandi, il menů ha una heigth che supera
la heigth dell'icona visibile in traybar.
Da ciň, discende che il MouseMove non avviene mai, e l'utente non riesce
ad interagire.
Per il momento il caso č limitato a una installazione su diverse
centinaia, e l'utente non si lamenta troppo (anche perchč c'č una
combinazione di tasti che richiama l'app in primo piano), ma mi
piacerebbe risolvere la cosa.
Idee?
Alberto
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Lasciando qualche twip libero tutto Ok.
Non mi risulta, anche perchč tu oltra a insicare il WM_MOUSEMOVE indichi
anche l'hWnd della finestra che riceve i messaggi e questa li dovrebbe
ricevere in qualunque condizione.
In alternativa puoi passare l'hWnd di una picturebox nascosta e usare il suo
di MouseMove, poi tieni conto che il messaggio cambia a seconda che lo
ScaleMode sia a twips o a pixels.


 ScaleMode sia a twips o a pixels.
Ma il problema del Menu resta, perchè il menù è sempre 'sopra' a
qualunque controllo che si trovi nella sua zona, e quindi non lascia
passare il mousemove.
A meno che...
Esisterà l'hWnd del menù?


 Esisterà l'hWnd del menù?
No, c'è un hMenu (sempre un handle ma i menu sono gli unici componenti gesti
in modo differente dalle finestre).
Comunque io facendo come ti ho detto (picturebox che intercetta il
messaggio) non ho mai avuto nessun problema, tanto più che la usavo come
client area del form (simulavo un form MDI) e conteneva anche altri
controlli.


ci sono andato ma non č quello che mi interessa...
quello che devo fare č qualcosa tipo i famosi "dialer"... un programma che
una volta lanciato resta solo come icona e NON nella barra delle
applicazioni e cliccando col tasto destro fa vedere un menu... esiste da
qualche parte del codice che mi guidi alla creazione di tutto ciň?? oltre a
questo chiaramente, devo poter personalizzare i menu... Grazie!

 Sopra a cosa?
Il menu a popup è nella zona della form vicino alla barra del titolo.
Non è clientarea, tanto che un eventuale controllo con Top=0 è tutto più
in basso del menu. Ma, in realtà, il menu è sotto al titolo, per cui,
quando 'ridimensioni' la form virtualmente per metterla in traybar, il
mousemove avviene sul menu e non sulla form.
Con risoluzioni e dimensioni di carattere 'normali', il menu non riesce
a coprire tutta l'area dell'icona in traybar, per cui tutto ok.
Con, invece, risoluzioni tipo 640x480 e caratteri grandi, il menu supera
la dimensione della tray bar, e il mouse move non arriva mai alla form.
Ho anche provato, tempo fa, mettendo una picturebox con top=0, poi ho
messo top=-500 (in modo da andare fra client area e titolo), ma niente
da fare. Il menù non passa l'evento alla window sottostante.
A quanto ne so, l'unica è attivare un hook di sistema sull'handle del
menu (via subclassing), ma è una soluzione brutta come la fame.
Ciao


 menu (via subclassing), ma è una soluzione brutta come la fame.
Non so cosa avete fatto voi, ma io lo uso da quando c'è VB4 e funziona
perfettamente senza nessun tipo di hook.
Mi pare ci sia pure un esempio sul sito comune.
Tra l'altro questa è la funzione che uso per capire cosa si stia facendo
sull'icona (chiamata nel MouseMove del form "iconizzato")
Function adTNAIconButton(ByVal x As Long, ByVal y As Long) As
EWindowMessages
'Ritorna lo stato dei pulsanti del mouse
'sull'icona della TNA
'Richiamarla in OggettoAssociato_MouseMove()
If y = 0 Then
    Select Case x 'in pixel
     Case WM_LBUTTONDOWN 'Premuto pulsante Sinistro
       adTNAIconButton = WM_LBUTTONDOWN
     Case WM_LBUTTONUP 'Rilasciato pulsante Sinistro
       adTNAIconButton = WM_LBUTTONUP
     Case WM_RBUTTONDOWN 'Premuto pulsante Destro
       adTNAIconButton = WM_RBUTTONDOWN
     Case WM_RBUTTONUP 'Rilasciato pulsante Destro
       adTNAIconButton = WM_RBUTTONUP
     Case WM_MOUSEMOVE 'Solo MouseMove
       adTNAIconButton = WM_MOUSEMOVE
    End Select
End If
End Function


 perfettamente senza nessun tipo di hook.
Per completezza questa è la funzione che inserisce nella traybar
Function adNotifyIcon(ByVal hIcon As Long, ByVal hWnd As Long, ByRef Tip As
String, ByVal iMode As ENIFlags) As Long
'Inserisce, toglie o modifica l'icona hIcon nella Try Notification Area
della TaskBar
'- hIcon è l'andle a un'icona ritornato da ExtractIcon,
'  o la proprietà .Icon
'- Tip è il messaggio che viene mostrato al passaggio del mouse
'- iMode può essere  NIM_ADD, NIM MODIFY, NIM_DELETE
'N.B. L'identificativo dell'icona sarà uguale all'ordine
'di inserimento: es 2a icona inserita ha indice = 2
#If Win32 Then
    Const NIF_MESSAGE = &H1
    Const NIF_ICON = &H2
    Const NIF_TIP = &H4
    Dim nid As NOTIFYICONDATA
    Static Index
    If iMode = NIM_ADD Then
        Index = Index + 1
    End If
    nid.hWnd = hWnd
    nid.hIcon = hIcon
    'nid.szTip = Tip & vbNullChar
    Call p_CopyMemory(nid.szTip(0), ByVal Tip & vbNullChar, Len(Tip &
vbNullChar))
    nid.uCallbackMessage = WM_MOUSEMOVE
    nid.cbSize = Len(nid)
    nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
    nid.uID = Index 'ID Custom
    p_Shell_NotifyIcon iMode, nid
    If iMode = NIM_DELETE Then
        Index = Index - 1
    End If
    adNotifyIcon = Index
#End If


 'Richiamarla in OggettoAssociato_MouseMove()
Quest'ultimo commento č il nocciolo della situazione. Nel caso che ti
spiegavo, l'evento OggettoAssociato_MouseMove() *non* avviene.
Ciao
Alberto


Ciao io ho avuto il tuo stesso problema, ho risolto impostando il parametro
nic.uCallbackMessage = MYTRAY_MESSAGE poi devi usare setwindowlong ed
addressof per una funzione di callback che ti notifichi i messaggi, adesso
non ho i sorgenti che stanno a casa, comunque ho la dll compilata se ti
interessa te la mando, tra l'altro fa pure i ballon-messagges.
Ciao.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 spiegavo, l'evento OggettoAssociato_MouseMove() *non* avviene.
Sorry, Zanna.
Avevi ragione tu.
Utilizzando l'handle di una PictureBox, funziona anche con risoluzioni
assurde.
Mi ero fossilizzato sull'handle della form, ed avevo capito che tu inserissi
una picturebox in alto a sinistra nella form.
Risolto tutto.
Grazie
Alberto

 una picturebox in alto a sinistra nella form.
non ha importanza la posizione o la dimensione del form
Ciao
