Veröffentlicht 23. April 200322 j Hallo, ich habe eine Anwendung, die als Icon in der Trayleiste läuft. Wenn ich nun mit der rechten Maustaste auf das Icon klicke soll ein Kontextmenü aufpoppen. Das klappt auch einigermaßen, allerdings geschieht das nicht bei jedem Rechtsklick auf das Icon. Es kommt also vor, dass man drei bis vier mal aud das Icon klicken muss, bis sich das Kontextmenü zeigt... Hier mal der Code: void CMainFrame::OnAusblenden() //Versteckt Anwendung und zeigt Icon im Tray { HICON hIcon=AfxGetApp() ->LoadIcon(IDR_MAINFRAME); ShowWindow( SW_HIDE ); NOTIFYICONDATA nid; memset( &nid, 0, sizeof( nid)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = GetSafeHwnd(); nid.uID = 0; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = UM_TRAY_ACTION; wsprintf( nid.szTip, TEXT("Monitor")); nid.hIcon = hIcon; Shell_NotifyIcon( NIM_ADD, &nid); } // Wird aufgerufen wenn Nachricht an Icon geht void CMainFrame::OnTrayAction(WPARAM wParam, LPARAM lParam) { //bei Doppelklick Anwendung zeigen und Icon entfernen //Das klappt einwandfrei if( lParam == WM_LBUTTONDBLCLK ) { NOTIFYICONDATA nid; memset( &nid, 0, sizeof( nid)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = GetSafeHwnd(); nid.uID = 0; Shell_NotifyIcon( NIM_DELETE, &nid); ShowWindow( SW_SHOW ); } //Bei Rechtsklick Kontextmenü aufrufen, klappt nur manchmal else if(lParam == WM_RBUTTONDOWN) { CPoint Point; GetCursorPos(&Point); SetForegroundWindow(); CMenu menu; menu.LoadMenu(IDR_MENU1); menu.GetSubMenu(0)->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON,Point.x ,Point.y, AfxGetMainWnd(),NULL); } } Hat jemand ne Idee warum das nicht immer klappt???
23. April 200322 j :uli Klotzkopp ich lieb Dich :hodata Jetzt klappt es, nur ich frage mich warum! Kannste das vielleicht noch mal kurz erklären?
23. April 200322 j Original geschrieben von mogli_81 Klotzkopp ich lieb Dich :hodata *rotwerd* Nicht doch... Jetzt klappt es, nur ich frage mich warum! Kannste das vielleicht noch mal kurz erklären? Das TrackPopupMenu-Problem bei Trayicons ist angeblich ein Feature. Ich finde den KB-Artikel gerade nicht, aber hier steht etwas darüber, unter "NOTE on TrackPopupMenu": http://www.codeproject.com/shell/systemtray.asp
23. April 200322 j Nun ja, Microsoft halt... Da sieht mans mal wieder, man muss nicht alles wissen, man muss nur wissen wo es steht
2. September 200321 j Ich hab da irgendwie noch Probleme mit. Bei mir stellt er das Popupmenü nur ca 2mm breit dar, sodass man nichts lesen kann. Man kann aber trotzdem die einzelnen Einträge auswählen:confused: if(lParam == WM_RBUTTONDOWN) { POINT Point; GetCursorPos(&Point); SetForegroundWindow(hWnd); TrackPopupMenu(LoadMenu(g_.hInst,MAKEINTRESOURCE(IDR_MENU1)), TPM_CENTERALIGN, Point.x,Point.y,0,hWnd,0); } [/PHP]
2. September 200321 j ::TrackPopupMenu verlangt ein HMENU, dass du aus CreatePopupMenu oder GetSubMenu erhalten hast. Hol dir das nullte SubMenu des geladenen Menüs und verwende dessen HMENU für TrackPopupMenu.
3. September 200321 j GetSubMenu() liefert irgendwie immer NULL zurück. hMenu = LoadMenu(g_.hInst,MAKEINTRESOURCE(IDR_MENU1)); hSub = GetSubMenu(hMenu,0); TrackPopupMenu(hSub,TPM_CENTERALIGN, Point.x,Point.y,0,hWnd,0); [/PHP]
3. September 200321 j Jetzt gehts doch, ich hatte im Rersourceneditor eingestellt das das Menü ein Popupmenü ist. Nachdem ich das weg gemacht habe gings. Original geschrieben von Matthes :uli Klotzkopp ich lieb Dich :hodata Dem schließe ich mich übrigens an:D
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.