PDA

Visualizza la versione completa : [C++] Intercettare messaggi di una Tray Icon


Akira86
13-08-2005, 17:41
Ciao a tutti..

Io ho fatto una funzione usando un API di windows che mi crea una tray icon e mi fa apparire una balloon tip però non riesco a associarli un evento..
Mi spiego meglio, questa e la funzione :



void ShowBalloonTip(unsigned short Visible, unsigned short Icon, String Title, String Message)
{
NOTIFYICONDATA m_nid;
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.hWnd= Application->Handle;
m_nid.uID= 100;
m_nid.uFlags = NIF_TIP | NIF_ICON |NIF_INFO | NIF_MESSAGE;
m_nid.uCallbackMessage= WM_USER+1;
m_nid.hIcon= Application->Icon->Handle;
m_nid.uTimeout = 200;
m_nid.dwInfoFlags = Icon;
lstrcpy(m_nid.szInfo,Message.c_str());
lstrcpy(m_nid.szInfoTitle,Title.c_str());
lstrcpy(m_nid.szTip,"Gestione Telefonia Message");
Shell_NotifyIcon(Visible, &m_nid);
}


richimandola con Visibile = NIM_ADD mi crea una tray icon e mi fa apparire una Balloon Tip con il messaggio mandato da parametro, io voglio associare un evento (tipo ButtonClik) per eseguire del codice quando l'utente clicca sul messagio o sulla tray icon..

Io uso Borland C++ e ho trovato poco in giro, ho visto che con Visual C++ usando solo le API basta stare in ascolto dei messaggi (WM_MBUTTONDOWN) con l'ID, nel parametro wParam, uguale a quello del tray icon pero qui come faccio? le VCL di borland non permettono di stare in ascolto dei messaggio ho sbaglio? ce un modo per mettermi in ascolto dei messaggi e con un IF eseguire del codice quando in wParam ce ID del tray icon?

Spero di essermi spiegato bene :confused: ..

Grazie in anticipo per le eventuali risposte.. :ciauz:

Akira86
17-08-2005, 13:16
Ho trovato, negli esempi per Delphi, l'uso della funzione :

procedure TMainForm.TrayMessage(var Msg: TMessage);

dove vengono analizzati i messagi della tray icon, però non riesco a capire come fa a sapere il programma che deve eseguire il codice in quella funzione? Nella struttura NOTIFYICONDATA ce uCallbackMessage e sempre negli esempi di delphi gli associano il valore WM_USER+1 che non so cosa significa. :cry:

Io ho provato a convertire ciò in c++ ma nel debug non esegue il codice di questa funzione quando clicco sulla tray icon, e non credo che delphi ci riesca, in fondo sono le stesse classi VCL che usano.

Secondo me devo mettere l'indirizzo o qualcosaltro nella variabile uCallbackMessage della struttura NOTIFYICONDATA e mi sa anche nell uID. :master: Qualche idea??

Aiuto.... :)

alka
17-08-2005, 14:33
Originariamente inviato da Akira86
però non riesco a capire come fa a sapere il programma che deve eseguire il codice in quella funzione?
Probabilmente, a fianco del metodo che hai trovato è presente una direttiva message, oppure l'indirizzo del metodo viene passato come parametro alla struttura che consente l'inserimento dell'icona nell'area system tray.


Originariamente inviato da Akira86
Nella struttura NOTIFYICONDATA ce uCallbackMessage e sempre negli esempi di delphi gli associano il valore WM_USER+1 che non so cosa significa. :cry:
Tutti i messaggi di Windows sono associati a costanti numeriche; la costante WM_USER è inizializzata con il valore più alto utilizzabile al di sopra della soglia dei valori numerici utilizzati da Windows a livello di sistema; da quel valore, è possibile incrementarli e utilizzarli per definire proprie costanti.


Originariamente inviato da Akira86
Io ho provato a convertire ciò in c++ ma nel debug non esegue il codice di questa funzione quando clicco sulla tray icon, e non credo che delphi ci riesca, in fondo sono le stesse classi VCL che usano.

Probabilmente, hai tralasciato qualcosa. La libreria VCL in questo caso c'entra poco: si tratta di usare API di Windows e sfruttare una funzionalità del compilatore creando metodi che possono rispondere direttamente a messaggi attraverso la direttiva message.


Originariamente inviato da Akira86
Secondo me devo mettere l'indirizzo o qualcosaltro nella variabile uCallbackMessage della struttura NOTIFYICONDATA e mi sa anche nell uID. :master: Qualche idea??

Hai dato un'occhiata al sito MSDN (http://msdn.microsoft.com) per la spiegazione del record NOTIFYICONDATA e dei campi che lo costituiscono?

Inoltre, mi viene da pensare che esistano già componenti in grado di gestire questa problematica...hai fatto una ricerca su Google (http://www.google.it)?

Ciao! :ciauz:

Akira86
20-08-2005, 19:14
Grazie alla spiegazioni di alka e cercando in google la direttiva MESSAGE in borland c++ ho trovato come fare.

Posto i codici, magari a qualcuno può interessare:

Nel Header File:


#define ID_CALLBACK WM_USER
#define ID_TRAYICON 1006
....
public:
virtual __fastcall TF_Main(TComponent* Owner);
void __fastcall TrayEvent(TMessage& Msg);
bool __fastcall ShowBalloonTip(DWORD Visible, DWORD Icon, String Title, String TipText);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(ID_CALLBACK,TMessage,TrayEvent);
END_MESSAGE_MAP(TForm)
....


Nel CPP File:


....
//-------------------------------------------------------------------
void __fastcall TF_Main::TrayEvent(TMessage& Msg)
{
POINT MousePos;

switch(Msg.LParam)
{
case WM_RBUTTONUP:
if (GetCursorPos(&MousePos))
{
PM_TrayIcon->PopupComponent = F_Main;
SetForegroundWindow(Handle);
PM_TrayIcon->Popup(MousePos.x, MousePos.y);
}
break;
case WM_LBUTTONUP:
ShowMessage("Click su Tray Icon");
break:
case 1029:
ShowMessage("Click su Balloon Tip");
break;
default:
break;
}
TForm::Dispatch(&Msg);
}
//-------------------------------------------------------------------
bool __fastcall TF_Main::ShowBalloonTip(DWORD Visible, DWORD Icon, String Title, String TipText)
{
NOTIFYICONDATA m_nid;
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.hWnd= Handle;
m_nid.uID= ID_TRAYICON;
m_nid.uFlags = NIF_TIP | NIF_ICON |NIF_INFO | NIF_MESSAGE;
m_nid.uCallbackMessage= ID_CALLBACK;
m_nid.hIcon= Application->Icon->Handle;
m_nid.uTimeout = 2000;
m_nid.dwInfoFlags = Icon;
lstrcpy(m_nid.szInfo,TipText.c_str());
lstrcpy(m_nid.szInfoTitle,Title.c_str());
lstrcpy(m_nid.szTip,"Gestione Telefonia Message");
Shell_NotifyIcon(Visible, &m_nid);

return (Shell_NotifyIcon(Visible, &m_nid));
}
//-------------------------------------------------------------------
....


Ancora Grazie a Alka..

Ciao... :ciauz:

Loading