TrackPopupMenu 関数 (winuser.h)
指定した場所にショートカット メニューを表示し、メニュー上の項目の選択を追跡します。 ショートカット メニューは、画面上の任意の場所に表示できます。
構文
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
);
パラメーター
[in] hMenu
種類: HMENU
表示するショートカット メニューへのハンドル。 ハンドルを取得するには、 CreatePopupMenu を 呼び出して新しいショートカット メニューを作成するか、 GetSubMenu を 呼び出して既存のメニュー項目に関連付けられているサブメニューへのハンドルを取得します。
[in] uFlags
型: UINT
これらのフラグのうち 0 個以上を使用して、関数オプションを指定します。
次のいずれかのフラグを使用して、関数がショートカット メニューを水平方向に配置する方法を指定します。
関数がショートカット メニューを垂直方向に配置する方法を指定するには、次のいずれかのフラグを使用します。
メニューの親ウィンドウを設定しなくても、ユーザー選択の検出を制御するには、次のフラグを使用します。
値 | 説明 |
---|---|
|
ユーザーがメニュー項目をクリックしても、この関数は通知メッセージを送信しません。 |
|
関数は、戻り値でユーザーの選択のメニュー項目識別子を返します。 |
ショートカット メニューで追跡するマウス ボタンを指定するには、次のいずれかのフラグを使用します。
値 | 説明 |
---|---|
|
ユーザーは、マウスの左ボタンのみでメニュー項目を選択できます。 |
|
ユーザーは、マウスの左ボタンと右ボタンの両方でメニュー項目を選択できます。 |
メニューのアニメーションを変更するには、次のフラグの適切な組み合わせを使用します。 たとえば、水平フラグと垂直フラグを選択することで、対角線アニメーションを実現できます。
アニメーションを実行するには、 SystemParametersInfo 関数で SPI_SETMENUANIMATIONを設定する必要があります。 また、メニュー フェード アニメーションがオンの場合、TPM_NOANIMATIONを除くすべての TPM_*ANIMATION フラグは無視されます。 詳細については、SystemParametersInfo の SPI_GETMENUFADE フラグを参照してください。
TPM_RECURSE フラグを使用して、別のメニューが既に表示されている場合にメニューを表示します。 これは、メニュー内のコンテキスト メニューをサポートすることを目的としています。
右から左へのテキスト レイアウトの場合は、 TPM_LAYOUTRTLを使用します。 既定では、テキスト レイアウトは左から右です。
[in] x
型: int
画面座標内のショートカット メニューの水平方向の位置。
[in] y
型: int
ショートカット メニューの垂直位置 (画面座標)。
[in] nReserved
型: int
予約;は 0 である必要があります。
[in] hWnd
型: HWND
ショートカット メニューを所有するウィンドウへのハンドル。 このウィンドウは、メニューからすべてのメッセージを受信します。 ウィンドウは、関数が戻るまでメニューから WM_COMMAND メッセージを受け取りません。 uFlags パラメーターで TPM_NONOTIFY を指定した場合、関数は hWnd で識別されたウィンドウにメッセージを送信しません。 ただし、 hWnd でウィンドウ ハンドルを渡す必要があります。 アプリケーションの任意のウィンドウ ハンドルを指定できます。
[in, optional] prcRect
型: const RECT*
無視されます。
戻り値
種類: BOOL
uFlags パラメーターでTPM_RETURNCMDを指定した場合、戻り値はユーザーが選択した項目のメニュー項目識別子です。 ユーザーが選択を行わずにメニューをキャンセルした場合、またはエラーが発生した場合、戻り値は 0 になります。
uFlags パラメーターでTPM_RETURNCMDを指定しない場合、関数が成功した場合は 0 以外、失敗した場合は 0 が返されます。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
TrackPopupMenu または TrackPopupMenuEx に渡す正しい水平方向の配置フラグ (TPM_LEFTALIGNまたはTPM_RIGHTALIGN) または水平方向のアニメーション方向フラグ (TPM_HORPOSANIMATIONまたはTPM_HORNEGANIMATION) を決定するには、SM_MENUDROPALIGNMENTで GetSystemMetrics を呼び出します。 これは、特に Microsoft タブレット PC アプリケーションを開発する場合に、最適なユーザー エクスペリエンスを作成するために不可欠です。
メニューが重ならないように画面の領域を指定するには、 TrackPopupMenuEx 関数を使用します。
通知アイコンのコンテキスト メニューを表示するには、アプリケーションが TrackPopupMenu または TrackPopupMenuEx を呼び出す前に、現在のウィンドウがフォアグラウンド ウィンドウである必要があります。 それ以外の場合、ユーザーがメニューの外側またはメニューを作成したウィンドウ (表示されている場合) をクリックしても、メニューは消えません。 現在のウィンドウが子ウィンドウの場合は、(最上位レベルの) 親ウィンドウを前景ウィンドウとして設定する必要があります。
ただし、現在のウィンドウがフォアグラウンド ウィンドウの場合、このメニューを 2 回目に表示すると、そのウィンドウが表示され、すぐに消えます。 これを修正するには、 TrackPopupMenu を呼び出したアプリケーションにタスクを強制的に切り替える必要があります。 これは、次のコード サンプルに示すように、ウィンドウまたはスレッドに無害なメッセージを投稿することによって行われます。
SetForegroundWindow(hDlg);
// Display the menu
TrackPopupMenu( hSubMenu,
TPM_RIGHTBUTTON,
pt.x,
pt.y,
0,
hDlg,
NULL);
PostMessage(hDlg, WM_NULL, 0, 0);
例
例については、「 ショートカット メニューの表示」を参照してください。
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | winuser.h (Windows.h を含む) |
Library | User32.lib |
[DLL] | User32.dll |
API セット | ext-ms-win-ntuser-menu-l1-1-0 (Windows 8 で導入) |
関連項目
概念
リファレンス