CreatePopupMenu



  • hi,

    ich hab ein menü welches bei rechtsklick auf das trayicon meines programmes erscheint; dies funktioniert ansich einwandfrei, jedoch wird dadurch das programm solange angehalten, bis ein item gewählt wurde bzw. es "weggeklickt" wurde.

    könnte mir jemand einen tipp geben damit es trotzdem weiterläuft auch wenn das popup menü aktiv ist?
    ich finde einfach keine lösung..

    danke.



  • hier noch mal ein beispiel falls meine formulierung unklar sein sollte:
    kurzer codeauschnitt
    ...

    case WM_RBUTTONUP: // rechte Maustaste

    SetForegroundWindow(hwnd);
    GetCursorPos(&pt);
    Auswahl = (int)TrackPopupMenu(hMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL);

    PostMessage(hwnd, WM_NULL, 0, 0);

    if (Auswahl==3)
    {....}

    ...

    also wenn mit rechtsklick das menü aufgerufen wird dann wartet das programm solange bis der benutzer eine auswahl gemacht hat und ich wollte wissen ob und wie es möglich ist, dass das programm trotzdem unblockiert weiterläuft.



  • TPM_RETURNCMD weglassen und via WM_COMMAND feststellen, was gewählt wurde 😉



  • hi,

    danke das geht!!

    nur ein problem hab ich noch:

    ...
    case WM_COMMAND:
     if ( LOWORD( wParam ) == 3) //3 ist mein menüitem
    {
    	  //mach irgendwas
    }
    
    ...
    ...
    
     case WM_RBUTTONUP: // rechte Maustaste
    
        SetForegroundWindow(hwnd);		
        GetCursorPos(&pt); 
        TrackPopupMenu(hMenu, TPM_RIGHTBUTTON , pt.x, pt.y, 0, hwnd, NULL); 
        PostMessage(hwnd, WM_NULL, 0, 0); 
    ....
    

    wenn ich nun rechtklick mache wird dies erkannt "//mach irgendwas" wird ausgeführt, programm läuft weiter, nur blöderweise wird "//mach irgendwas" immer wieder ausgeführt (ununterbrochen ohne erneuerte aktivierung durch menüauswahl) ?? 😕
    was könnte mein fehler sein? steh ich auf dem schlauch?



  • zu "case" hast du auch überall nen "break" oder ?
    Prüf mal noch lParam und HIWORD(wParam) - vielleicht kommen die gar nicht vom Menü...



  • hi, ich poste mal einen gekürzten code auschnitte (ich hoffe ich hab nicht zu viel gekürzt 😉 )

    switch (message)
        {
    
        case WM_COMMAND:
     if ( LOWORD( wParam ) == 3) //bei auswahl des menüitem 3
    {
    
    //mach was
    }
    break;
    
        case WM_CREATE:
    
          hMenu = CreatePopupMenu (); // Menu anlegen 
    
          InsertMenu (hMenu, 0, MF_BYPOSITION, 0, "bla");
          InsertMenu (hMenu, 1, MF_BYPOSITION, 1, "bla");
          InsertMenu (hMenu, 2, MF_SEPARATOR, 0, NULL); // Separator 
          InsertMenu (hMenu, 3, MF_BYPOSITION, 3, "bla");
          break ;
    
        case WM_PAINT:
            hdc = BeginPaint (hwnd, &ps) ;
            EndPaint (hwnd, &ps) ;
            break ;
    
    //Nachricht bei klick auf das Icon in der Taskbar
        case WM_ICONCLICK:
            switch(lParam)
            {
                case WM_LBUTTONUP: // linke Maustaste
                    //..bla
    	   break;
    
                case WM_RBUTTONUP: // rechte Maustaste
    
        SetForegroundWindow(hwnd);		
        GetCursorPos(&pt); 
        TrackPopupMenu(hMenu, TPM_RIGHTBUTTON , pt.x, pt.y, 0, hwnd, NULL); 
        PostMessage(hwnd, WM_NULL, 0, 0); 
        break;
            }
            return 0;
    
        case WM_DESTROY:
    // Icon entfernen
    		DestroyMenu (hMenu);
    
            Icon_in_Taskleiste (hwnd, FALSE); // Icon aus der Taskleiste entfernen
            DestroyIcon (hIcon); // Speicher freigeben
    
            PostQuitMessage (0) ;
            return 0 ;
    
        default:
        //  Taskleiste  neu gestartet:
            if (message == s_uTaskbarRestart)
            Icon_in_Taskleiste (hwnd, TRUE); // Icon in die Taskleiste setzen
            break;
         }
    
        return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    


  • die message wird irgendwie nicht gelöscht? das eie message von wo anders her kommt kann ich mir nicht vorstellen, sonst würde dies doch nicht nur als folge eines ersten rechtsklick passieren. 😕 😕



  • Du solltest vielleicht auch den HIWORD noch auswerten, denn es gibt sicher einige Nachrichten mit LOWORD von 3 😉



  • sorry, aber ich find leider nirgends was HIWORD (wParam) zurückgeben soll?, ich dachte zuerst halt das handle vom menü if (HIWORD (wParam) == hMenu)... aber das ist total falsch... 😕



  • Sorry, sehe gerade, dass das im MSDN-Example auch nicht gemacht wird - ansonsten:

    The high-order word specifies the notification code if the message is from a control. [..] If the message is from a menu, this value is zero.

    Der Fehler steckt also wo anders. Kann es vielleicht sein, dass du bei einem darüberliegenden case das break vergessen hast, oder was ändert sich durch den Mausklick (denn davor bekommst du ja nicht dauernd diese Nachricht)



  • ich werd mir morgen den code nochmal gründlich vornehmen, aber mal eine kurze zwischenfrage:

    wie bekomme ich das handle vom menü?
    mit LOWORD( wParam ) bekomme das ausgewählte menüitem, aber wie finde ich heraus von welchem menü diese kommt. (also in meinem beispiel hMenu) ?



  • so, ich hab jetzt mal rumprobiert

    wenn ich

    [cpp] case WM_COMMAND:
    if ( LOWORD( wParam ) == 3) //bei auswahl des menüitem 3
    {
    //mach was
    PostMessage(hwnd, WM_NULL, 0, 0);//neu
    }
    break; [/cpp]

    das postmessage da rein nehme tritt der fehler nicht mehr auf? ist das nun korrekt oder ist das nun gewissermassen "zufall" das es dadurch jetzt geht?

    und weiß nun vielleicht jemand wie ich an das handle vom menü komme?
    also wenn ich jetzt mehrer menüs habe

    hMenu1 = CreatePopupMenu ();
    InsertMenu (hMenu1, 0, MF_BYPOSITION, 1, "text1");

    hMenu2 = CreatePopupMenu ();
    InsertMenu (hMenu2, 0, MF_BYPOSITION, 1, "text2");

    dann bekomme ich ja mit LOWORD( wParam ) == 1 für beide menüs eine übereinstimmung?

    cu



  • LOWORD( wParam ) sollte eigentlich für beide 0 sein, denn da wird die ID übergeben - das wass du bei InsertMenu als zweites angegeben hast. Dafür definiert man sich für gewöhnlich Konstanten.


Anmelden zum Antworten