Programm in den Tray - und wieder raus!!!
-
Hi..
Ich hab bis tjetzt folgenden code:void IcoToTray (HWND hwnd, BOOL bShow) { NOTIFYICONDATA tsym; ZeroMemory (&tsym, sizeof (NOTIFYICONDATA)); if (bShow) { tsym.cbSize = sizeof (NOTIFYICONDATA); tsym.hWnd = hwnd; tsym.uID = 1; tsym.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE; tsym.uCallbackMessage = WM_APP; tsym.hIcon = LoadIcon (NULL, IDI_APPLICATION); strcpy (tsym.szTip, "Mein Programm..."); Shell_NotifyIcon (NIM_ADD, &tsym); } else { tsym.cbSize = sizeof (NOTIFYICONDATA); tsym.hWnd = hwnd; tsym.uID = 1; tsym.uFlags = 0; Shell_NotifyIcon (NIM_DELETE, &tsym); } return; }Wie mache ich da jetzt das wenn ich auf das icon klicke das der dialog wieder erscheint???
-
Hi,
lol?!, Na du machen auf gleiche Weise, wie du Fenster hast verschwinden lassen...

Du hast doch unter WM_APP (schätze ich mal, steht ja nit direkt in deinem Post) den Klick der Maus registriert und auf Grund dessen das Fenster versteckt...da kannst du es auch wieder anzeigen.
PS: Ich tipp mal ganz spontan, dass der Code weder von dir ist, noch das du ihn verstanden hast oder...das soll nun keineswegs abwertend sein...jedoch nur einHinweis darauf, dass du ihn vllt. erst verstehen solltest...dann wird auch klar warum da:
tsym.uCallbackMessage = WM_APP;steht.

-
also die funktion IcoToTray wird durch einen button im dialgo aufgerufen!!!!
-
Schreib einfach n MessageHandler für die Nachricht WM_APP.
PS: Hast du die Nachricht WM_APP mittels RegisterWindowMessage() registriert ?
-
Da mir jetzt im Kopf nicht einfällt wie das ging, hab ich nochmal den Code-Schnipsel rausgesucht, der mir geholfen hat:
http://www.winapi.net/index.php?inhalt=s16
Da gibts fast nen fertiges Prog.
-
Hallo @ll,
ich wollt nicht wieder ein neues Thread aufmachen.Ich habe ein ähnliches Problem, und dank dem Codeschnippsel habe ich folgendes überlegt:
entweder ich finde einfach den Fehler nicht,
oder ich habe die falsche Ausbildung gewählt
#include <stdio.h> #define _WIN32_WINNT 0x0600 #include <windows.h> #include <time.h> #include <winsock.h> #include <conio.h> #include <stdbool.h> #include "./header/strops.h" #include <commctrl.h> #define WM_ICONCLICK (WM_APP+0) /*1 = Add ToTray|| 0 = DelFromTray*/ bool SysTray_IconOpts( HWND hWnd, bool add ); LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); /************************** MAIN *******************************/ int main( void ) { RegisterWindowMessage( "WM_APP" ); RegisterWindowMessage( "WM_ICONCLICK" ); //benötigte variablen HWND myCMD, nextWindow; char *text; int answer; MSG msg; text = malloc( sizeof( char ) * 1024 ); //Das Konsolenfenster finden. myCMD = (HWND) GetConsoleWindow(); //Fenster in den Tray eintragen if( SysTray_IconOpts( myCMD, 1 ) ) //Fenster verstecken ShowWindow( myCMD, SW_HIDE ); // else printf( "Failure" ); nextWindow = GetNextWindow( myCMD, GW_HWNDNEXT ); MessageBox( NULL, "blubb", "hey", MB_OK ); while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } MessageBox( NULL, text, "hey2", MB_OK ); } bool SysTray_IconOpts( HWND hWnd, bool add ) { int ret; ret = 0; if( 1 == add ) { /*Nötigkeitsdaten für die Tray Option. */ NOTIFYICONDATA nid; char *ballonText = "This is NaDiA. Its the 'net send' command for Vista", *ballonTitle = "NachrichtenDienstApplikation(NaDiA)"; nid.cbSize = sizeof(NOTIFYICONDATA); /*Das Fenster, zu dem der Tray-Eintrag gehört. */ nid.hWnd = hWnd; /*Die Tray_ID, damit sie später gelöscht werden kann. */ nid.uID = 0x0200; /*Das icon dess Tray-Eintrages. */ nid.hIcon = LoadImage( NULL, "C:\\NaDiA\\48.ico", IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); strcpy( nid.szTip, ballonText ); nid.uCallbackMessage = WM_ICONCLICK; /*Was alles möglich sein soll, momentan nur der Icon und das Draufklicken. */ nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; ret = Shell_NotifyIcon(NIM_ADD, &nid); } else { /*Nötigkeitsdaten für die Tray Option. */ NOTIFYICONDATA nid; memset(&nid, 0, sizeof(nid)); nid.cbSize = sizeof(nid); /*Das Fenster, zu dem der Tray-Eintrag gehört. */ nid.hWnd = hWnd; nid.uFlags = 0; /*Die Tray_ID, damit sie später gelöscht werden kann. */ nid.uID = 0x0200; ret = Shell_NotifyIcon(NIM_DELETE, &nid); } return ret; } LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { UINT uID; UINT uMouseMsg; MessageBox( NULL, "ich war hier", "und du liest es", MB_OK ); /*Die Gesendete Message. */ uID = (UINT)wParam; /*Die gedrückte Maustaste. */ uMouseMsg = (UINT)lParam; if( WM_ICONCLICK == msg ) { if( WM_LBUTTONUP == uMouseMsg ) { MessageBox( NULL, "WM_LBUTTONDOWN", "if..", 0 ); } else MessageBox( NULL, "Else", "anders", 0 ); } else MessageBox( NULL, "Else", "anders2", 0 ); }So, da sehe ich:
Den NIF_TIP | NIF_ICON
aber kein NIF_MESSAGE...
Ich verstehe dass nicht, ich habe ja schon angefangen aus diesem Codeschnippsel was zu übernehmen

Ich programmiere mit C und MinGW(der Compiler) und dann noch Notepad++(Texteditor)...
Habe Windows Vista und einen passenden PC.Ich frage mich ehrlich wo ich da den Fehler gemacht habe...
könnt ihr mir bitte helfen`?
-
Kannst du bitte genauer erklären, wo dein Problem liegt? Du hast dort "NIF_ICON | NIF_MESSAGE | NIF_TIP" angegeben, also werden auch alle drei Werte übernommen (btw, das Tray-Icon schickt dir alle Arten von Maus-Nachrichten, da mußt du schon selber die Klicks herausfiltern).
-
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { UINT uID; UINT uMouseMsg; MessageBox( NULL, "ich war hier", "und du liest es", MB_OK ); [...]sry war nicht präzise genug...
Diese MessageBox wird nicht angezeigt... nie...
Also geht er auch dementsprechend nciht in diese Funktion...Aber wie ich dass mitbekommen habe, sollte er da rein gehen, wenn er ne Message bekommt oder nciht?
-
Wenn die WndProc genutzt werden soll, mußt du dem System auch sagen, daß sie existiert (RegisterClass()). (aber dazu können dir die WinAPI-Experten sicher mehr erzählen)
PS: Die beiden Nachrichten, die du bei Programmanfang mit RegisterWindowMessage() anlegst, haben herzlich wenig mit WM_APP und WM_ICONCLICK zu tun

-
Ja gut, dann können die raus ja?
RegisterClass hört sich nach klassen an... diese gibt es in C doch nciht oder?
-
Ja, RegisterClass() hört sich nach Klassen an - aber das hat nichts mit den Klassen in C++ zu tun, sondern mit den Fensterklassen der WinAPI.
-
Meine main:
int main( void ) { //benötigte variablen HWND myCMD, nextWindow; char *text; int answer; MSG msg; WNDCLASSEX wndclassex = {0}; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = *WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = 0; wndclassex.hIcon = NULL; wndclassex.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclassex.hbrBackground = WHITE_BRUSH; wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = "test"; wndclassex.hIconSm = wndclassex.hIcon; RegisterClassEx( &wndclassex ); text = malloc( sizeof( char ) * 1024 ); //Das Konsolenfenster finden. myCMD = (HWND) GetConsoleWindow(); //Fenster in den Tray eintragen if( SysTray_IconOpts( myCMD, 1 ) ) //Fenster verstecken ShowWindow( myCMD, SW_HIDE ); // else printf( "Failure" ); nextWindow = GetNextWindow( myCMD, GW_HWNDNEXT ); MessageBox( NULL, "blubb", "hey", MB_OK ); while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } MessageBox( NULL, text, "hey2", MB_OK ); }Es Funktioniert immer noch nicht,
aber:wndclassex.hInstance = 0; wndclassex.hIcon = NULL; wndclassex.hbrBackground = WHITE_BRUSH; wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = "test";die habe ich glaube ich entweder geschrottet, oder richtig angepasst...
Ich bin mir auch noch nicht so sicher, wofür dass überhaupt gut ist...
Ich will ja nur die WndProc nutzen können, dass ist also dazu da um dem Programm zu sagen, dass es diese gibt?
-
So jetzt bin ich echt am ende...
#include <stdio.h> #define _WIN32_WINNT 0x0600 #include <windows.h> #include <time.h> #include <winsock.h> #include <conio.h> #include <stdbool.h> #include "./header/strops.h" #include <commctrl.h> #define WM_ICONCLICK (WM_APP+0) /*1 = Add ToTray|| 0 = DelFromTray*/ bool SysTray_IconOpts( HWND hWnd, bool add ); LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); /************************** MAIN *******************************/ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow ) { RegisterWindowMessage( "WM_APP" ); RegisterWindowMessage( "WM_ICONCLICK" ); //benötigte variablen HWND myCMD, nextWindow; char *text; int answer; MSG msg; WNDCLASSEX wndclassex = {0}; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = (WNDPROC)WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = hInstance; wndclassex.hIcon = LoadImage( NULL, "C:\\NaDiA\\48.ico", IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); wndclassex.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclassex.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = "test"; wndclassex.hIconSm = wndclassex.hIcon; RegisterClassEx( &wndclassex );Ob man noch alle Include Dateien braucht weis ich nicht.
Aber eigentlich sollte -für diesen abschnitt zumindest- die windows.h reichen../ccC0baaa.o:tray.c:(.text+0x4ce): undefined reference to `GetStockObject@4'Ich habe in meinem schlauen "C Einführung und professionelle Anwendungen" nachgeschaut, und so meine Struktur aufgebessert. Die binden auch nur die windows.h ein...
Wieso nur....
[edit]
"Gdi32.lib" bitte nicht vergessen
-
#include <stdio.h> #define _WIN32_WINNT 0x0600 #include <windows.h> #include <time.h> #include <winsock.h> #include <conio.h> #include <stdbool.h> #include "./header/strops.h" #include <commctrl.h> #define WM_ICONCLICK (WM_APP+0) /*1 = Add ToTray|| 0 = DelFromTray*/ bool SysTray_IconOpts( HWND hWnd, bool add ); LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); void initInstance( int, HINSTANCE ); /************************** MAIN *******************************/ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow ) { RegisterWindowMessage( "WM_APP" ); RegisterWindowMessage( "WM_ICONCLICK" ); //benötigte variablen HWND myCMD, nextWindow; char *text; int answer; MSG msg; WNDCLASSEX wndclassex; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = (WNDPROC)WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = hInstance; wndclassex.hIcon = LoadImage( NULL, "C:\\NaDiA\\48.ico", IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); wndclassex.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclassex.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = "test"; wndclassex.hIconSm = wndclassex.hIcon; RegisterClassEx( &wndclassex ); initInstance( nCmdShow, hInstance ); text = malloc( sizeof( char ) * 1024 ); //Das Konsolenfenster finden. myCMD = (HWND) GetConsoleWindow(); //Fenster in den Tray eintragen if( SysTray_IconOpts( myCMD, 1 ) ) //Fenster verstecken ShowWindow( myCMD, SW_HIDE ); // else printf( "Failure" ); nextWindow = GetNextWindow( myCMD, GW_HWNDNEXT ); while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); Sleep( 10 ); } return msg.wParam; } bool SysTray_IconOpts( HWND hWnd, bool add ) { int ret; ret = 0; if( 1 == add ) { /*Nötigkeitsdaten für die Tray Option. */ NOTIFYICONDATA nid; char *ballonText = "This is NaDiA. Its the 'net send' command for Vista", *ballonTitle = "NachrichtenDienstApplikation(NaDiA)"; nid.cbSize = sizeof(NOTIFYICONDATA); /*Das Fenster, zu dem der Tray-Eintrag gehört. */ nid.hWnd = hWnd; /*Die Tray_ID, damit sie später gelöscht werden kann. */ nid.uID = 1; /*Das icon dess Tray-Eintrages. */ nid.hIcon = LoadImage( NULL, "C:\\NaDiA\\48.ico", IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); strcpy( nid.szTip, ballonText ); nid.uCallbackMessage = WM_ICONCLICK; /*Was alles möglich sein soll, momentan nur der Icon und das Draufklicken. */ nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; ret = Shell_NotifyIcon(NIM_ADD, &nid); } else { /*Nötigkeitsdaten für die Tray Option. */ NOTIFYICONDATA nid; memset(&nid, 0, sizeof(nid)); nid.cbSize = sizeof(nid); /*Das Fenster, zu dem der Tray-Eintrag gehört. */ nid.hWnd = hWnd; nid.uFlags = 0; /*Die Tray_ID, damit sie später gelöscht werden kann. */ nid.uID = 0x0200; ret = Shell_NotifyIcon(NIM_DELETE, &nid); } return ret; } LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { UINT uID; UINT uMouseMsg; /*Die Gesendete Message. */ uID = (UINT)wParam; switch( msg ) { case WM_ICONCLICK: MessageBox( hWnd, "ICONCLICK", "Info", MB_OK ); switch( lParam ) { case WM_LBUTTONUP: MessageBox( hWnd, "Linke Maustaste", "Info", MB_OK ); break; default: MessageBox( hWnd, "Andere Maustaste", "Info", MB_OK ); break; } break; case WM_DESTROY: SysTray_IconOpts( hWnd, 0 ); PostQuitMessage( 0 ); break; } return DefWindowProc( hWnd, msg, wParam, lParam ); } void initInstance( int Inst, HINSTANCE hInstance ) { HWND hWnd; hWnd = CreateWindow( "test", "nocheiner", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL ); UpdateWindow( hWnd ); }Noch sehr unkommentiert ich weis

ABER:
es geht nicht, allso er geht schonmal in diese WndProc rein, aber nicht in mein WM_ICONCLICK... warum?
-
Ich setze hier ein Post nach den anderen, tut mir leid, aber sonst schaut hier ja keiner rein.
Also ich verstehe dass nicht, iach habe mir http://www.winapi.net/index.php?inhalt=s16 zur hilfe genommen, und leider musste ich feststellen dass dass so nicht geht.
Ich habe bemerkt dass das eine cpp Datei ist.
Ich programmiere in C ist es also überhaupt möglich sowas zu machen?#define WM_ICONCLICK (WM_APP + 1) [...] nid.uCallbackMessage = WM_ICONCLICK; [...] LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { MessageBox( NULL, "Hier is was", "Nachricht-Benachrichtigung", MB_OK ); switch( message ) { case WM_ICONCLICK: switch( lParam ) { case WM_LBUTTONDOWN: SysTray_IconOpts( hWnd, 0 ); break; default: SysTray_IconOpts( hWnd, 0 ); break; } break; case WM_DESTROY: SysTray_IconOpts( hWnd, 0 ); PostQuitMessage( 0 ); break; } return DefWindowProc( hWnd, message, wParam, lParam ); }Wenn ich jetzt schreibe
//Das Fenster registrieren, damit uCallbackMessage funktioniert WNDCLASSEX wndclassex; //größe der Struktur wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; //Die Prozedure für dass Fenster(hier: überprüfung der Messages) wndclassex.lpfnWndProc = (WNDPROC)WndProc; //eventueller zusätzlicher Speicher, den das Programm benötigt wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; //Handle von der Instanz wndclassex.hInstance = hInstance; //Das icon wndclassex.hIcon = LoadImage( NULL, "C:\\NaDiA\\48.ico", IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); //Der Cursor(Standard) wndclassex.hCursor = LoadCursor( NULL, IDC_ARROW ); //Hintergrundfarbe wndclassex.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); //Der Menuename(Keines vorhanden) wndclassex.lpszMenuName = NULL; //Name des Fensters(egal, da kein Fenster vorhanden [HIDE]) wndclassex.lpszClassName = "tray-class"; //Icon in kleinformat wndclassex.hIconSm = wndclassex.hIcon;Wird die MessageBox -beim Start dess Programmes- nicht angezeigt.
//Das Fenster registrieren, damit uCallbackMessage funktioniert WNDCLASSEX wndclassex; //größe der Struktur wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; //Die Prozedure für dass Fenster(hier: überprüfung der Messages) wndclassex.lpfnWndProc = (WNDPROC)WndProc; //eventueller zusätzlicher Speicher, den das Programm benötigt wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; //Handle von der Instanz wndclassex.hInstance = hInstance; //Das icon wndclassex.hIcon = LoadImage( NULL, "C:\\NaDiA\\48.ico", IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); //Der Cursor(Standard) wndclassex.hCursor = LoadCursor( NULL, IDC_ARROW ); //Hintergrundfarbe wndclassex.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); //Der Menuename(Keines vorhanden) wndclassex.lpszMenuName = NULL; //Name des Fensters(egal, da kein Fenster vorhanden [HIDE]) wndclassex.lpszClassName = "test"; //<< HIER ist die änderung //Icon in kleinformat wndclassex.hIconSm = wndclassex.hIcon;So werden beim Start ca.. ka 15 MessageBoxen angezeigt.
Bei beiden Varianten kann ich jedoch x000 mal auf den Icon klicken, leider passiert NIE auch nur eine sache....
Wisst ihr wieso? Ich verzweifel gerade ehrlich...
Ich habe ja schon bei winapi.net -wie oben erwähnt- nachgeschaut, und da ist im grunde alles gleich.
Und da soll es angeblich klappen.
