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???
Klotzkopp Geschrieben 23. April 2003 Geschrieben 23. April 2003 Setz mal ein PostMessage( WM_NULL ); hinter den Aufruf von TrackPopupMenu.
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?
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
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
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]
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.
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]
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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden