Matthes Geschrieben 23. April 2003 Geschrieben 23. April 2003 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??? Zitieren
Klotzkopp Geschrieben 23. April 2003 Geschrieben 23. April 2003 Setz mal ein PostMessage( WM_NULL ); hinter den Aufruf von TrackPopupMenu. Zitieren
Matthes Geschrieben 23. April 2003 Autor Geschrieben 23. April 2003 :uli Klotzkopp ich lieb Dich :hodata Jetzt klappt es, nur ich frage mich warum! Kannste das vielleicht noch mal kurz erklären? Zitieren
Klotzkopp Geschrieben 23. April 2003 Geschrieben 23. April 2003 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 Zitieren
Matthes Geschrieben 23. April 2003 Autor Geschrieben 23. April 2003 Nun ja, Microsoft halt... Da sieht mans mal wieder, man muss nicht alles wissen, man muss nur wissen wo es steht Zitieren
Guybrush Threepwood Geschrieben 2. September 2003 Geschrieben 2. September 2003 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] Zitieren
Klotzkopp Geschrieben 2. September 2003 Geschrieben 2. September 2003 ::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. Zitieren
Guybrush Threepwood Geschrieben 3. September 2003 Geschrieben 3. September 2003 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] Zitieren
Guybrush Threepwood Geschrieben 3. September 2003 Geschrieben 3. September 2003 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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.