TrackPopupMenu-Funktion (winuser.h)

Zeigt ein Kontextmenü an der angegebenen Position an und verfolgt die Auswahl der Elemente im Menü nach. Das Kontextmenü kann an einer beliebigen Stelle auf dem Bildschirm angezeigt werden.

Syntax

BOOL TrackPopupMenu(
  [in]           HMENU      hMenu,
  [in]           UINT       uFlags,
  [in]           int        x,
  [in]           int        y,
  [in]           int        nReserved,
  [in]           HWND       hWnd,
  [in, optional] const RECT *prcRect
);

Parameter

[in] hMenu

Typ: HMENU

Ein Handle zum anzuzeigenden Kontextmenü. Das Handle kann abgerufen werden, indem Sie CreatePopupMenu aufrufen, um ein neues Kontextmenü zu erstellen, oder durch Aufrufen von GetSubMenu , um ein Handle zu einem Untermenü abzurufen, das einem vorhandenen Menüelement zugeordnet ist.

[in] uFlags

Typ: UINT

Verwenden Sie null dieser Flags, um Funktionsoptionen anzugeben.

Verwenden Sie eines der folgenden Flags, um anzugeben, wie die Funktion das Kontextmenü horizontal positioniert.

Wert Bedeutung
TPM_CENTERALIGN
0x0004L
Zentriert das Kontextmenü horizontal relativ zur vom x-Parameter angegebenen Koordinate.
TPM_LEFTALIGN
0x0000L
Positioniert das Kontextmenü so, dass die linke Seite an der vom x-Parameter angegebenen Koordinate ausgerichtet ist.
TPM_RIGHTALIGN
0x0008L
Positioniert das Kontextmenü so, dass die rechte Seite an der vom x-Parameter angegebenen Koordinate ausgerichtet ist.
 

Verwenden Sie eines der folgenden Flags, um anzugeben, wie die Funktion das Kontextmenü vertikal positioniert.

Wert Bedeutung
TPM_BOTTOMALIGN
0x0020L
Positioniert das Kontextmenü so, dass seine untere Seite an der vom y-Parameter angegebenen Koordinate ausgerichtet ist.
TPM_TOPALIGN
0x0000L
Positioniert das Kontextmenü so, dass die obere Seite an der vom y-Parameter angegebenen Koordinate ausgerichtet ist.
TPM_VCENTERALIGN
0x0010L
Zentriert das Kontextmenü vertikal relativ zur vom y-Parameter angegebenen Koordinate.
 

Verwenden Sie die folgenden Flags, um die Ermittlung der Benutzerauswahl zu steuern, ohne ein übergeordnetes Fenster für das Menü einrichten zu müssen.

Wert Bedeutung
TPM_NONOTIFY
0x0080L
Die Funktion sendet keine Benachrichtigungen, wenn der Benutzer auf ein Menüelement klickt.
TPM_RETURNCMD
0x0100L
Die Funktion gibt den Menüelementbezeichner der Auswahl des Benutzers im Rückgabewert zurück.
 

Verwenden Sie eines der folgenden Flags, um anzugeben, welche Maustaste im Kontextmenü nachverfolgt wird.

Wert Bedeutung
TPM_LEFTBUTTON
0x0000L
Der Benutzer kann Menüelemente nur mit der linken Maustaste auswählen.
TPM_RIGHTBUTTON
0x0002L
Der Benutzer kann Menüelemente sowohl mit der linken als auch mit der rechten Maustaste auswählen.
 

Verwenden Sie eine vernünftige Kombination der folgenden Flags, um die Animation eines Menüs zu ändern. Wenn Sie beispielsweise ein horizontales und ein vertikales Flag auswählen, können Sie eine diagonale Animation erzielen.

Wert Bedeutung
TPM_HORNEGANIMATION
0x0800L
Animiert das Menü von rechts nach links.
TPM_HORPOSANIMATION
0x0400L
Animiert das Menü von links nach rechts.
TPM_NOANIMATION
0x4000L
Zeigt ein Menü ohne Animation an.
TPM_VERNEGANIMATION
0x2000L
Animiert das Menü von unten nach oben.
TPM_VERPOSANIMATION
0x1000L
Animiert das Menü von oben nach unten.
 

Damit animationen ausgeführt werden können, muss die SystemParametersInfo-FunktionSPI_SETMENUANIMATION festlegen. Außerdem werden alle TPM_*ANIMATION-Flags außer TPM_NOANIMATION ignoriert, wenn die Menüblendanimation aktiviert ist. Weitere Informationen finden Sie unter SPI_GETMENUFADE-Flag in SystemParametersInfo.

Verwenden Sie das flag TPM_RECURSE , um ein Menü anzuzeigen, wenn bereits ein anderes Menü angezeigt wird. Dies soll Kontextmenüs innerhalb eines Menüs unterstützen.

Verwenden Sie für das Textlayout von rechts nach links TPM_LAYOUTRTL. Standardmäßig ist das Textlayout von links nach rechts.

[in] x

Typ: int

Die horizontale Position des Kontextmenüs in Bildschirmkoordinaten.

[in] y

Typ: int

Die vertikale Position des Kontextmenüs in Bildschirmkoordinaten.

[in] nReserved

Typ: int

Reserviert; muss null sein.

[in] hWnd

Typ: HWND

Ein Handle für das Fenster, das das Kontextmenü besitzt. Dieses Fenster empfängt alle Nachrichten aus dem Menü. Das Fenster empfängt keine WM_COMMAND Nachricht aus dem Menü, bis die Funktion zurückgegeben wird. Wenn Sie im uFlags-Parameter TPM_NONOTIFY angeben, sendet die Funktion keine Nachrichten an das von hWnd identifizierte Fenster. Sie müssen jedoch weiterhin ein Fensterhandle in hWnd übergeben. Es kann sich um ein beliebiges Fensterhandle aus Ihrer Anwendung sein.

[in, optional] prcRect

Typ: const RECT*

Ignoriert.

Rückgabewert

Typ: BOOL

Wenn Sie im uFlags-ParameterTPM_RETURNCMD angeben, ist der Rückgabewert der Menüelementbezeichner des elements, das der Benutzer ausgewählt hat. Wenn der Benutzer das Menü abbricht, ohne eine Auswahl vorzunehmen, oder wenn ein Fehler auftritt, ist der Rückgabewert null.

Wenn Sie TPM_RETURNCMD im uFlags-Parameter nicht angeben, ist der Rückgabewert ungleich null, wenn die Funktion erfolgreich ist, und null, wenn sie fehlschlägt. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

Hinweise

Rufen Sie GetSystemMetrics mit SM_MENUDROPALIGNMENT auf, um das richtige horizontale Ausrichtungsflag (TPM_LEFTALIGN oder TPM_RIGHTALIGN) und/oder das horizontale Animationsrichtungsflag (TPM_HORPOSANIMATION oder TPM_HORNEGANIMATION) zu bestimmen, das an TrackPopupMenu oder TrackPopupMenuEx übergeben werden soll. Dies ist wichtig, um eine optimale Benutzererfahrung zu schaffen, insbesondere bei der Entwicklung von Microsoft Tablet PC-Anwendungen.

Verwenden Sie die Funktion TrackPopupMenuEx , um einen Bereich des Bildschirms anzugeben, der sich nicht überlappen soll.

Um ein Kontextmenü für ein Benachrichtigungssymbol anzuzeigen, muss das aktuelle Fenster das Vordergrundfenster sein, bevor die Anwendung TrackPopupMenu oder TrackPopupMenuEx aufruft. Andernfalls wird das Menü nicht ausgeblendet, wenn der Benutzer außerhalb des Menüs oder des Fensters klickt, in dem das Menü erstellt wurde (sofern es sichtbar ist). Wenn das aktuelle Fenster ein untergeordnetes Fenster ist, müssen Sie das übergeordnete Fenster (oberste Ebene) als Vordergrundfenster festlegen.

Wenn das aktuelle Fenster jedoch das Vordergrundfenster ist, wird dieses Menü beim zweiten Mal angezeigt und dann sofort ausgeblendet. Um dies zu beheben, müssen Sie einen Taskwechsel zu der Anwendung erzwingen, die TrackPopupMenu aufgerufen hat. Dies erfolgt, indem eine unschädliche Nachricht an das Fenster oder den Thread gesendet wird, wie im folgenden Codebeispiel gezeigt:


   SetForegroundWindow(hDlg);

   // Display the menu
   TrackPopupMenu(   hSubMenu,
                     TPM_RIGHTBUTTON,
                     pt.x,
                     pt.y,
                     0,
                     hDlg,
                     NULL);

   PostMessage(hDlg, WM_NULL, 0, 0);
 

Beispiele

Ein Beispiel finden Sie unter Anzeigen eines Kontextmenüs.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile winuser.h (windows.h einschließen)
Bibliothek User32.lib
DLL User32.dll
APIs ext-ms-win-ntuser-menu-l1-1-0 (eingeführt in Windows 8)

Siehe auch

Konzept

CreatePopupMenu

GetSubMenu

Menüs

Referenz

TrackPopupMenuEx

WM_COMMAND