Icon im SystemTray verschwindet bei Kontakt mit dem Cursor, Prog läuft aber noch...
-
Moin!
Ich habe folgendes Problem: Ich möchte meine Anwendung so gestalten, dass sie im Hintergrund bleibt, bis der Benutzer auf das Tray-Icon klickt. Aus Eurer FAQ habe ich den Code zum Erzeugen eines Tray-Icons her:
char szTip[64] = "Matze's Lupe (Linke Maustaste zum Starten)"; nidTrayIcon.cbSize = sizeof(nidTrayIcon); nidTrayIcon.hIcon = (HICON)LoadImage(NULL,".\\iconLupe16.ico",IMAGE_ICON,16,16,LR_LOADFROMFILE); nidTrayIcon.hWnd = hWnd; nidTrayIcon.uCallbackMessage = (WM_USER + 1); nidTrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nidTrayIcon.uID = 0x0200; strcpy(nidTrayIcon.szTip, szTip); nidTrayIcon.szTip[strlen(szTip)] = '\0'; Shell_NotifyIcon(NIM_ADD, &nidTrayIcon);Nun habe ich den Effekt, dass das Icon verschwindet, sobald ich den Mauszeiger darüber bewege. Das Programm läuft aber noch (=>TaskMan).
Irgendjemand eine Idee?
Gruß Matze
-
-
versuch mal bei
nidTrayIcon.uID = NULL;
bzw. ein Menu (IDR_MENU) zu übergeben.
-
Danke für die schnellen Antworten!
ID=NULL hat nix gebracht, Menü habe ich nicht probiert. Allerdings hat das Beispiel von winapi.net funktioniert, aber nur in einem eigenen Test-Projekt, die Übernahme der Funktionen hat nicht geklappt.
Ich habe dann etwas rumprobiert und habe folgende Lösung gefunden: Die Initialisierung des Tray-Icons darf scheinbar nicht in der WinMain passieren, aus welchem Grund auch immer. Wenn man nämlich den ganzen Code nimmt und in WM_CREATE packt (wie auch im winapi.net-Beispiel), dann klappt es komischerweise.
Ich wäre dankbar, wenn jemand eine plausible Erklärung dafür hätte.
Gruß Matze
-
...also so:
case (WM_USER+1): //Nachrichten für das Tray-Icon switch(lParam) { case WM_MOUSEMOVE: return 0; case WM_RBUTTONUP: //Rechtsklick: Programm wird beendet SendMessage(hWnd,WM_CLOSE,0,0); return 0; case WM_LBUTTONUP: SetForegroundWindow(hWnd); ShowWindow(hWnd,SW_SHOW); return 0; } case WM_CREATE: { SetCursorPos(GetSystemMetrics(SM_CXSCREEN)/2,GetSystemMetrics(SM_CYSCREEN)/2); hideCursor(); GetCursorPos(&mousePos); wsprintf(sTitleBar,"Matze's Lupe (Vergrößerung: %iX)",(int)iLupeFaktor); SetWindowText(hWnd,sTitleBar); nidTrayIcon.cbSize = sizeof(NOTIFYICONDATA); nidTrayIcon.hIcon = (HICON)LoadImage(NULL,".\\iconLupe16.ico",IMAGE_ICON,16,16,LR_LOADFROMFILE); nidTrayIcon.hWnd = hWnd; nidTrayIcon.uCallbackMessage = (WM_USER+1); nidTrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nidTrayIcon.uID = 1; strcpy(nidTrayIcon.szTip, szTip); nidTrayIcon.szTip[strlen(szTip)] = '\0'; Shell_NotifyIcon(NIM_ADD, &nidTrayIcon); return 0; }
-
default: // Wurde die Taskleiste zwischendurch neu gestartet? if (message == s_uTaskbarRestart) Icon_in_Taskleiste (hwnd, TRUE); // Icon in die Taskleiste setzen break;Ich denke mal daran liegts.
Das das Icon halt immer mal wieder neu gezeichnet werden muss.
Aber andre wissen das bestimmt besser
-
Das war auch eine meiner vielen Vermutungen, woran's denn liegen könnte, aber nein, das isses nicht. Diesen Code habe ich momentan gar nicht drinnen.
Zum Vergleich meinen Code mit allen relevanten Stellen:
NOTIFYICONDATA nidTrayIcon; // HWND hWnd; //Fenster-Handle //-------------------------------------------------------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) { //-------------------------------------------------------------------------------------------------------------------------- MSG msg; //Struktur für Windows-Nachrichten WNDCLASS wc; //Struktur für den Typ der Fensterklasse // int iGetMessageRetVal; // wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //Adresse der Funktion, die die Nachrichtenbehandlung übernehmen soll (Callback-Funktion) wc.cbClsExtra = 0; //zusätzlichen Speicher kann mit diesen Variablen wc.cbWndExtra = 0; //für das Fenster reserviert werden (?) wc.lpszClassName = szAppName; //Fensterklassenname, hierüber kann man dann Instanzen der Fensterklasse erzeugen wc.lpszMenuName = NULL; wc.hInstance = hInstance; //Handle der Programminstanz wc.hCursor = LoadCursor(NULL,IDC_ARROW); //zu verwendender Cursor // wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); //zu verwendendes Icon wc.hIcon = (HICON)LoadImage(NULL,".\\iconLupe16.ico",IMAGE_ICON,16,16,LR_LOADFROMFILE); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // RegisterClass(&wc); //die Fensterklasse muss registriert werden, um in CreateWindow() benutzt werden zu können // // hWnd = CreateWindow(szAppName,"Lupe",WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,WinSizeX,WinSizeY,NULL,NULL,hInstance,NULL); // ScreenShotWholeDesktop(); hbm = (HBITMAP)LoadImage( NULL, ".\\__TMP__SCRNSHOT__2357__.BMP", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); // ShowWindow(hWnd,iCmdShow); SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); CenterWindow(hWnd); UpdateWindow(hWnd); ShowWindow(hWnd,SW_HIDE); // while(iGetMessageRetVal=GetMessage(&msg,NULL,0,0)) { //2. Parameter muss NULL sein, sonst richten sich die Nachrichten nur an den Thread, nicht ans Fenster if(iGetMessageRetVal==-1) { break; } TranslateMessage(&msg); DispatchMessage(&msg); // } // DeleteObject(hbm); //ScreenShot-Objekt DeleteObject(hbmOld); Shell_NotifyIcon(NIM_DELETE,&nidTrayIcon); // return msg.wParam; } //-------------------------------------------------------------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { //-------------------------------------------------------------------------------------------------------------------------- static RECT rect; static bool isActive; // switch(msg) { case (WM_USER+1): // - Nachrichten für das Tray-Icon - switch(lParam) { case WM_MOUSEMOVE: return 0; case WM_RBUTTONUP: //Rechtsklick: Programm wird beendet SendMessage(hWnd,WM_CLOSE,0,0); return 0; case WM_LBUTTONUP: ShowWindow(hWnd,SW_SHOW); SetForegroundWindow(hWnd); return 0; } case WM_CREATE: { SetCursorPos(GetSystemMetrics(SM_CXSCREEN)/2,GetSystemMetrics(SM_CYSCREEN)/2); hideCursor(); GetCursorPos(&mousePos); wsprintf(sTitleBar,"Matze's Lupe (Vergrößerung: %iX)",(int)iLupeFaktor); SetWindowText(hWnd,sTitleBar); nidTrayIcon.cbSize = sizeof(NOTIFYICONDATA); nidTrayIcon.hIcon = (HICON)LoadImage(NULL,".\\iconLupe16.ico",IMAGE_ICON,16,16,LR_LOADFROMFILE); nidTrayIcon.hWnd = hWnd; nidTrayIcon.uCallbackMessage = (WM_USER+1); nidTrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nidTrayIcon.uID = 1; strcpy(nidTrayIcon.szTip, szTip); nidTrayIcon.szTip[strlen(szTip)] = '\0'; Shell_NotifyIcon(NIM_ADD, &nidTrayIcon); return 0; }Gruß Matze
-
ich hab mir auch mal eine classe gebastelt die ein try icon verwaltet, wenn mich nicht alles täuscht bin ich damals auch über den selben stein gestolpert wie du gerade
ich glaube mich zu entsinnen das erst als ich eine membervariable für NOTIFYICONDATA angelegt habe das icon blieb. mit bestimmtheit sagen kann ich es aber nicht mehr.