CONTEXTMENUITEM2
構造体サイズ=各フィールドのバイト数(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 によって追加され、選択された場合、lCommandID は 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)これらのビットが設定されている場合、挿入ポイントとサブメニュー以外の項目は追加できません。 挿入ポイント ID の次のビットは、挿入ポイント (fSpecialFlags と CCM_SPECIAL_INSERTION_POINT) またはサブメニュー (fFlags と MF_POPUP) である項目に対して特別な扱いが必要です。 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 (ゼロ)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)プライマリスナップインは、この挿入ポイントを使用して 表示 メニューに項目を追加できます。ユーザーがツールバーの 表示 ドロップダウンメニューをクリックした場合、この挿入ポイントは存在しますが、New と All Tasks の挿入ポイントは表示されません。 CCM_INSERTIONPOINTID_3RDPARTY_NEW (0x90000001)拡張スナップインは、この挿入ポイントを使用して 新規作成 サブメニューの末尾に項目を追加できます。新規作成 サブメニューは、スコープペインのコンテキストメニューにのみ存在し、結果ペインのコンテキストメニューには存在しません。 CCM_INSERTIONPOINTID_3RDPARTY_TASK (0x90000002)拡張スナップインは、この挿入ポイントを使用して すべてのタスク サブメニューの末尾に項目を追加できます。 CCM_INSERTIONPOINTID_ROOT_MENU (0x80000000)IContextMenuProvider は、この挿入ポイントを使用してルートメニューに項目を追加できます。 プライマリ拡張もサードパーティ拡張も、IContextMenuProvider によって追加された挿入ポイントを介する場合を除き、ルートメニューに項目を追加できません。 |
| fFlags | INT | 4 | +24 | +16 | 次のスタイルフラグのうち 1 つ以上を指定する値です。 MF_POPUP作成される項目は、コンテキストメニュー内のサブメニューです。作成されたサブメニューには、メニュー項目、挿入ポイント、および他のサブメニューを追加できます。新しいメニュー項目、サブメニュー、または挿入ポイントでは、作成されたサブメニューの lCommandID メンバーを lInsertionPointID メンバーの値として使用します。 MF_BITMAPこのフラグはサポートされていません。IContextMenuCallback2::AddItem は E_INVALIDARG を返します。 MF_OWNERDRAWこのフラグはサポートされていません。IContextMenuCallback2::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 (0x0001)lInsertionPointID 以外のすべてのパラメーターを無視します。メニューの末尾または指定された挿入ポイントにセパレーターを追加します。メニューまたはサブメニューの先頭や末尾に配置されたセパレーターは表示されません。間にメニュー項目が存在しないセパレーターは、1 つのセパレーターにまとめられます。 特別なものかどうかにかかわらず、セパレーターを追加できるのは IContextMenuProvider のみです。 CCM_SPECIAL_SUBMENU (0x0002)このサブメニューが空の場合、淡色表示になります。これは MF_POPUP 項目に対してのみ有効です。 CCM_SPECIAL_DEFAULT_ITEM (0x0004)これが既定のメニュー項目です。複数のメニュー項目がこのフラグを指定している場合は、各サブメニュー内の最後の項目が優先されます。 CCM_SPECIAL_INSERTION_POINT (0x0008)lCommandID と lInsertionPointID 以外のすべてのパラメーターを無視します。このフラグは、lInsertionPointID で識別される挿入ポイントまたはサブメニューの末尾に新しい挿入ポイントを作成します。作成された挿入ポイントには、新しいメニュー項目、サブメニュー、または挿入ポイントを追加できます。新しいメニュー項目、サブメニュー、または挿入ポイントでは、作成された挿入ポイントの lCommandID メンバーを lInsertionPointID メンバーの値として使用します。 CCM_SPECIAL_TESTONLY = 0x0010項目のパラメーターを検証しますが、メニュー項目は追加しません。追加操作が成功したかどうかを示す結果コードを返します。 |
| strLanguageIndependentName | LPWSTR | 8/4 | +32 | +24 | メニュー項目の言語非依存の名前です。MMC 2.0 オートメーションオブジェクトモデル のアプリケーションでは、MenuItem.LanguageIndependentName プロパティを取得することでこの値を取得できます。セパレーターまたは挿入ポイントを追加する場合を除き、strLanguageIndependentName メンバーを NULL または空の文字列にすることはできません。空の場合、IContextMenuCallback::AddItem メソッドは戻り値として E_INVALIDARG を返して失敗します。 |
公式ドキュメント
CONTEXTMENUITEM2 構造体は MMC 2.0 で導入されました。
CONTEXTMENUITEM2 構造体は、新しいメニュー項目、サブメニュー、または挿入ポイントを定義するために、IContextMenuCallback2::AddItem メソッド、または (IContextMenuCallback から継承された) IContextMenuProvider::AddItem メソッドに渡されます。コンテキストメニューはルートから下方向に構築され、新しい項目はそれぞれ、その項目が挿入されるサブメニューまたは挿入ポイントの末尾に追加されます。CONTEXTMENUITEM2 構造体は CONTEXTMENUITEM 構造体に代わるものです (strLanguageIndependentName メンバー以外の CONTEXTMENUITEM2 のすべてのメンバーは CONTEXTMENUITEM にも含まれています)。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// CONTEXTMENUITEM2 (x64 40 / x86 28 バイト)
typedef struct CONTEXTMENUITEM2 {
LPWSTR strName;
LPWSTR strStatusBarText;
INT lCommandID;
INT lInsertionPointID;
INT fFlags;
INT fSpecialFlags;
LPWSTR strLanguageIndependentName;
} CONTEXTMENUITEM2;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CONTEXTMENUITEM2
{
public IntPtr strName;
public IntPtr strStatusBarText;
public int lCommandID;
public int lInsertionPointID;
public int fFlags;
public int fSpecialFlags;
public IntPtr strLanguageIndependentName;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CONTEXTMENUITEM2
Public strName As IntPtr
Public strStatusBarText As IntPtr
Public lCommandID As Integer
Public lInsertionPointID As Integer
Public fFlags As Integer
Public fSpecialFlags As Integer
Public strLanguageIndependentName As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class CONTEXTMENUITEM2(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),
("strLanguageIndependentName", ctypes.c_void_p),
]#[repr(C)]
pub struct CONTEXTMENUITEM2 {
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,
pub strLanguageIndependentName: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type CONTEXTMENUITEM2 struct {
strName uintptr
strStatusBarText uintptr
lCommandID int32
lInsertionPointID int32
fFlags int32
fSpecialFlags int32
strLanguageIndependentName uintptr
}type
CONTEXTMENUITEM2 = record
strName: Pointer;
strStatusBarText: Pointer;
lCommandID: Integer;
lInsertionPointID: Integer;
fFlags: Integer;
fSpecialFlags: Integer;
strLanguageIndependentName: Pointer;
end;const CONTEXTMENUITEM2 = extern struct {
strName: ?*anyopaque,
strStatusBarText: ?*anyopaque,
lCommandID: i32,
lInsertionPointID: i32,
fFlags: i32,
fSpecialFlags: i32,
strLanguageIndependentName: ?*anyopaque,
};type
CONTEXTMENUITEM2 {.bycopy.} = object
strName: pointer
strStatusBarText: pointer
lCommandID: int32
lInsertionPointID: int32
fFlags: int32
fSpecialFlags: int32
strLanguageIndependentName: pointerstruct CONTEXTMENUITEM2
{
void* strName;
void* strStatusBarText;
int lCommandID;
int lInsertionPointID;
int fFlags;
int fSpecialFlags;
void* strLanguageIndependentName;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CONTEXTMENUITEM2 サイズ: 28 バイト(x86)
dim st, 7 ; 4byte整数×7(構造体サイズ 28 / 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 も可)
; strLanguageIndependentName : LPWSTR (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CONTEXTMENUITEM2 サイズ: 40 バイト(x64)
dim st, 10 ; 4byte整数×10(構造体サイズ 40 / 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 も可)
; strLanguageIndependentName : LPWSTR (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global CONTEXTMENUITEM2
#field intptr strName
#field intptr strStatusBarText
#field int lCommandID
#field int lInsertionPointID
#field int fFlags
#field int fSpecialFlags
#field intptr strLanguageIndependentName
#endstruct
stdim st, CONTEXTMENUITEM2 ; NSTRUCT 変数を確保
st->lCommandID = 100
mes "lCommandID=" + st->lCommandID