CONTEXTMENUITEM
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| strName | LPWSTR | 8/4 | +0 | +0 | null で終わる文字列へのポインターで、メニュー項目またはサブメニューの名前を格納します。区切り線または挿入ポイントの場合を除き、このメンバーを NULL にすることはできません。 |
| strStatusBarText | LPWSTR | 8/4 | +8 | +4 | null で終わる文字列へのポインターで、この項目が強調表示されているときにステータスバーに表示されるテキストを格納します。このメンバーは NULL でもかまいません。 |
| lCommandID | INT | 4 | +16 | +8 | メニュー項目のコマンド識別子を指定する値です。このメニュー項目が IExtendContextMenu::AddMenuItems によって追加され、 その後選択された場合、これは IExtendContextMenu::Command に返されるコマンド ID です。 このメニュー項目が IContextMenuProvider インターフェイスによって追加され、その後選択された場合、これは IContextMenuProvider::ShowContextMenu によって pISelected に返されるコマンド ID です。 これが挿入ポイント (fSpecialFlags に CCM_SPECIAL_INSERTION_POINT が設定されている場合) またはサブメニュー (fFlags に MF_POPUP が設定されている場合) である場合は、後続の呼び出しで lCommandID を lInsertionPointID として使用します (詳細については以下の一覧を参照してください)。新しい挿入ポイント ID では 特定のビットをオンにし、それ以外のビットをオフにする必要があるため、以下の説明を注意深くお読みください。 挿入ポイントでもサブメニューでもない項目の場合、コマンド ID の一部のビットには特別な扱いが必要です。 CCM_COMMANDID_MASK_RESERVED = 0xFFFF0000これらのビットが設定されている場合、挿入ポイントおよびサブメニュー以外の項目を追加することはできません。 挿入ポイント (fSpecialFlags と CCM_SPECIAL_INSERTION_POINT) またはサブメニュー (fFlags と MF_POPUP) である項目の場合、挿入ポイント ID の一部のビットには特別な扱いが必要です。 CCM_INSERTIONPOINTID_MASK_SPECIAL = 0xFFFF0000特別な動作を表します。スナップインは、それ以外のビットを必要に応じて使用できます。 CCM_INSERTIONPOINTID_MASK_SHARED = 0x80000000これらの挿入ポイントおよびサブメニューは、コンテキストメニューの作成者、プライマリ拡張、およびサードパーティ拡張の間で共有されます。共有された挿入ポイントまたはサブメニューに追加された項目は、コンテキストメニューの作成者、プライマリ拡張、およびサードパーティ拡張から利用できます。 このビットが設定されていない場合、 IContextMenuProvider インターフェイスと各拡張は同じ ID を使用できます。それぞれの ID は異なる挿入ポイントまたはサブメニューを指します。 共有された挿入ポイントまたはサブメニューを作成できるのは、コンテキストメニューの作成者とプライマリスナップインだけです。 CCM_INSERTIONPOINTID_MASK_CREATE_PRIMARY = 0x40000000このビットは、プライマリスナップインが作成した共有の挿入ポイントおよびサブメニューでは設定する必要があり、コンテキストメニューの作成者が作成したものでは設定してはなりません。これにより、共有の挿入ポイントおよびサブメニューの 2 つの作成元の間で ID が競合するのを防ぎます。 CCM_INSERTIONPOINTID_MASK_ADD_PRIMARY = 0x20000000プライマリスナップインが共有の挿入ポイントまたはサブメニューに項目を追加できるようにします。 CCM_INSERTIONPOINTID_MASK_ADD_3RDPARTY = 0x10000000拡張スナップインが共有の挿入ポイントまたはサブメニューに項目を追加できるようにします。 CCM_INSERTIONPOINTID_MASK_RESERVED = 0x0FFF0000これらのビットのいずれかが設定されている場合、挿入ポイントまたはサブメニューを追加することはできません。 |
| lInsertionPointID | INT | 4 | +20 | +12 | 新しい項目をコンテキストメニュー内のどこに追加するかを指定する値です。スナップインは、メニューの作成者またはプライマリスナップインが作成した挿入ポイントにのみ項目を追加できます。スコープペインおよびリストビュー結果ペインの項目に対する既定のコンテキストメニューで、MMC が作成する挿入ポイントは次のとおりです。 0 (zero)lInsertionPointID が 0 の場合は、このコンテキストメニューのルートメニューを指します。0 は CCM_INSERTIONPOINTID_ROOT_MENU と同じ意味で使用できます。ルートメニューに直接項目を追加できるのは IContextMenuProvider インターフェイスだけである点に注意してください。拡張は、 IContextMenuProvider または MMC によってルートメニューに追加された挿入ポイントおよびサブメニューにのみ項目を追加できます。 CCM_INSERTIONPOINTID_PRIMARY_TOP = 0xA0000000プライマリスナップインは、この挿入ポイントを使用して、メインのコンテキストメニューの先頭に項目を追加できます。 CCM_INSERTIONPOINTID_PRIMARY_NEW = 0xA0000001プライマリスナップインは、この挿入ポイントを使用して、[新規作成] サブメニューの先頭に項目を追加できます。[新規作成] サブメニューは、スコープペインと結果ペインの両方のコンテキストメニューで利用できます。 CCM_INSERTIONPOINTID_PRIMARY_TASK = 0xA0000002プライマリスナップインは、この挿入ポイントを使用して、[すべてのタスク] サブメニューの先頭に項目を追加できます。[すべてのタスク] サブメニューは、スコープペインと結果ペインの両方のコンテキストメニューで利用できます。 CCM_INSERTIONPOINTID_PRIMARY_VIEW = 0xA0000003プライマリスナップインは、この挿入ポイントを使用して、 表示 ドロップダウンメニューに項目を追加できます。ユーザーがツールバーの 表示 メニューをクリックした場合、この挿入ポイントは存在しますが、[新規作成] および [すべてのタスク] の挿入ポイントは表示されません。 CCM_INSERTIONPOINTID_3RDPARTY_NEW = 0x90000001拡張スナップインは、この挿入ポイントを使用して、[新規作成] サブメニューの末尾に項目を追加できます。[新規作成] サブメニューは、スコープペインのコンテキストメニューにのみ存在し、結果ペインのコンテキストメニューには存在しません。 CCM_INSERTIONPOINTID_3RDPARTY_TASK = 0x90000002拡張スナップインは、この挿入ポイントを使用して、[すべてのタスク] サブメニューの末尾に項目を追加できます。 CCM_INSERTIONPOINTID_ROOT_MENU = 0x80000000IContextMenuProvider インターフェイスは、この挿入ポイントを使用してルートメニューに項目を追加できます。 プライマリ拡張もサードパーティ拡張も、 IContextMenuProvider によって追加された挿入ポイントを介する場合を除き、ルートメニューに項目を追加することはできません。 |
| fFlags | INT | 4 | +24 | +16 | 次のスタイルフラグの 1 つ以上を指定する値です。 MF_POPUPこれがコンテキストメニュー内のサブメニューであることを指定する値です。この lCommandID を lInsertionPointID として使用することで、メニュー項目、挿入ポイント、およびさらに下位のサブメニューをこのサブメニューに追加できます。 MF_BITMAPこれらのフラグはサポートされておらず、指定すると IContextMenuCallback::AddItem は E_INVALIDARG を返します。 MF_SEPARATOR水平の区切り線を描画します。 MF_SEPARATOR を設定したメニュー項目を追加できるのは、 IContextMenuProvider インターフェイスだけです。 次のフラグは、Windows API における動作と同じように機能します。 MF_CHECKEDメニュー項目にチェックを付けます。 MF_DISABLEDメニュー項目を無効にして選択できないようにしますが、グレー表示にはしません。 MF_ENABLEDメニュー項目を有効にして選択できるようにし、グレー表示の状態から元に戻します。 MF_GRAYEDメニュー項目を無効にし、グレー表示にして選択できないようにします。 MF_MENUBARBREAKメニューバーに対する MF_MENUBREAK フラグと同じように機能します。ドロップダウンメニュー、サブメニュー、またはショートカットメニューの場合、新しい列は元の列と垂直線で区切られます。 MF_MENUBREAK列を線で区切らずに、項目を新しい行 (メニューバーの場合) または新しい列 (ドロップダウンメニュー、サブメニュー、またはショートカットメニューの場合) に配置します。 MF_UNCHECKED項目にチェックを付けません (既定)。 次の各グループのフラグは、同時に使用することはできません。 |
| fSpecialFlags | INT | 4 | +28 | +20 | 次のフラグの 1 つ以上を指定する値です。 CCM_SPECIAL_SEPARATOR = 0x0001lInsertionPointID を除く他のすべてのパラメーターを無視します。メニューの末尾、または指定された挿入ポイントに区切り線を追加します。メニューまたはサブメニューの先頭や末尾に配置された区切り線は表示されません。間にメニュー項目がない区切り線は、1 本の区切り線にまとめられます。 特別なものかどうかを問わず、区切り線を追加できるのは IContextMenuProvider インターフェイスだけです。 CCM_SPECIAL_SUBMENU = 0x0002このサブメニューが空の場合、グレー表示になり無効化されます。これは MF_POPUP 項目に対してのみ有効です。 CCM_SPECIAL_DEFAULT_ITEM = 0x0004既定のメニュー項目です。複数のメニュー項目でこのフラグが指定されている場合は、各サブメニュー内の最後の項目が優先されます。 CCM_SPECIAL_INSERTION_POINT = 0x0008lCommandID と lInsertionPointID を除く他のすべてのパラメーターを無視します。これにより、lInsertionPointID で識別される挿入ポイントまたはサブメニューの末尾に、新しい挿入ポイントが作成されます。 後続の呼び出しでは、この呼び出しの lCommandID パラメーターを lInsertionPointID として使用し、メニュー内のこの位置に独自のメニュー項目、サブメニュー、または挿入ポイントを挿入できます。 CCM_SPECIAL_TESTONLY = 0x0010項目のパラメーターを検証しますが、メニュー項目は追加しません。追加が成功したかどうかを示す結果コードを返します。 |
公式ドキュメント
CONTEXTMENUITEM 構造体は、新しいメニュー項目、サブメニュー、または挿入ポイントを定義するために、 IContextMenuCallback::AddItem メソッド、または (IContextMenuCallback から継承された) IContextMenuProvider::AddItem メソッドに渡されます。コンテキストメニューはルートから順に構築され、 新しい項目はそれぞれ、挿入先となるサブメニューまたは挿入ポイントの末尾に追加されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// CONTEXTMENUITEM (x64 32 / x86 24 バイト)
typedef struct CONTEXTMENUITEM {
LPWSTR strName;
LPWSTR strStatusBarText;
INT lCommandID;
INT lInsertionPointID;
INT fFlags;
INT fSpecialFlags;
} CONTEXTMENUITEM;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CONTEXTMENUITEM
{
public IntPtr strName;
public IntPtr strStatusBarText;
public int lCommandID;
public int lInsertionPointID;
public int fFlags;
public int fSpecialFlags;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CONTEXTMENUITEM
Public strName As IntPtr
Public strStatusBarText As IntPtr
Public lCommandID As Integer
Public lInsertionPointID As Integer
Public fFlags As Integer
Public fSpecialFlags As Integer
End Structureimport ctypes
from ctypes import wintypes
class CONTEXTMENUITEM(ctypes.Structure):
_fields_ = [
("strName", ctypes.c_void_p),
("strStatusBarText", ctypes.c_void_p),
("lCommandID", ctypes.c_int),
("lInsertionPointID", ctypes.c_int),
("fFlags", ctypes.c_int),
("fSpecialFlags", ctypes.c_int),
]#[repr(C)]
pub struct CONTEXTMENUITEM {
pub strName: *mut core::ffi::c_void,
pub strStatusBarText: *mut core::ffi::c_void,
pub lCommandID: i32,
pub lInsertionPointID: i32,
pub fFlags: i32,
pub fSpecialFlags: i32,
}import "golang.org/x/sys/windows"
type CONTEXTMENUITEM struct {
strName uintptr
strStatusBarText uintptr
lCommandID int32
lInsertionPointID int32
fFlags int32
fSpecialFlags int32
}type
CONTEXTMENUITEM = record
strName: Pointer;
strStatusBarText: Pointer;
lCommandID: Integer;
lInsertionPointID: Integer;
fFlags: Integer;
fSpecialFlags: Integer;
end;const CONTEXTMENUITEM = extern struct {
strName: ?*anyopaque,
strStatusBarText: ?*anyopaque,
lCommandID: i32,
lInsertionPointID: i32,
fFlags: i32,
fSpecialFlags: i32,
};type
CONTEXTMENUITEM {.bycopy.} = object
strName: pointer
strStatusBarText: pointer
lCommandID: int32
lInsertionPointID: int32
fFlags: int32
fSpecialFlags: int32struct CONTEXTMENUITEM
{
void* strName;
void* strStatusBarText;
int lCommandID;
int lInsertionPointID;
int fFlags;
int fSpecialFlags;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CONTEXTMENUITEM サイズ: 24 バイト(x86)
dim st, 6 ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; strName : LPWSTR (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; strStatusBarText : LPWSTR (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; lCommandID : INT (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; lInsertionPointID : INT (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; fFlags : INT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; fSpecialFlags : INT (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CONTEXTMENUITEM サイズ: 32 バイト(x64)
dim st, 8 ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; strName : LPWSTR (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; strStatusBarText : LPWSTR (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; lCommandID : INT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; lInsertionPointID : INT (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; fFlags : INT (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; fSpecialFlags : INT (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global CONTEXTMENUITEM
#field intptr strName
#field intptr strStatusBarText
#field int lCommandID
#field int lInsertionPointID
#field int fFlags
#field int fSpecialFlags
#endstruct
stdim st, CONTEXTMENUITEM ; NSTRUCT 変数を確保
st->lCommandID = 100
mes "lCommandID=" + st->lCommandID