Win32 API 日本語リファレンス
ホームSystem.Mmc › CONTEXTMENUITEM

CONTEXTMENUITEM

構造体
サイズx64: 32 バイト / x86: 24 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
strNameLPWSTR8/4+0+0null で終わる文字列へのポインターで、メニュー項目またはサブメニューの名前を格納します。区切り線または挿入ポイントの場合を除き、このメンバーを NULL にすることはできません。
strStatusBarTextLPWSTR8/4+8+4null で終わる文字列へのポインターで、この項目が強調表示されているときにステータスバーに表示されるテキストを格納します。このメンバーは NULL でもかまいません。
lCommandIDINT4+16+8

メニュー項目のコマンド識別子を指定する値です。このメニュー項目が IExtendContextMenu::AddMenuItems によって追加され、 その後選択された場合、これは IExtendContextMenu::Command に返されるコマンド ID です。 このメニュー項目が IContextMenuProvider インターフェイスによって追加され、その後選択された場合、これは IContextMenuProvider::ShowContextMenu によって pISelected に返されるコマンド ID です。 これが挿入ポイント (fSpecialFlagsCCM_SPECIAL_INSERTION_POINT が設定されている場合) またはサブメニュー (fFlagsMF_POPUP が設定されている場合) である場合は、後続の呼び出しで lCommandIDlInsertionPointID として使用します (詳細については以下の一覧を参照してください)。新しい挿入ポイント ID では 特定のビットをオンにし、それ以外のビットをオフにする必要があるため、以下の説明を注意深くお読みください。

挿入ポイントでもサブメニューでもない項目の場合、コマンド ID の一部のビットには特別な扱いが必要です。

CCM_COMMANDID_MASK_RESERVED = 0xFFFF0000

これらのビットが設定されている場合、挿入ポイントおよびサブメニュー以外の項目を追加することはできません。

挿入ポイント (fSpecialFlagsCCM_SPECIAL_INSERTION_POINT) またはサブメニュー (fFlagsMF_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

これらのビットのいずれかが設定されている場合、挿入ポイントまたはサブメニューを追加することはできません。

lInsertionPointIDINT4+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 = 0x80000000

IContextMenuProvider インターフェイスは、この挿入ポイントを使用してルートメニューに項目を追加できます。

プライマリ拡張もサードパーティ拡張も、 IContextMenuProvider によって追加された挿入ポイントを介する場合を除き、ルートメニューに項目を追加することはできません。

fFlagsINT4+24+16

次のスタイルフラグの 1 つ以上を指定する値です。

MF_POPUP

これがコンテキストメニュー内のサブメニューであることを指定する値です。この lCommandIDlInsertionPointID として使用することで、メニュー項目、挿入ポイント、およびさらに下位のサブメニューをこのサブメニューに追加できます。

MF_BITMAP

MF_OWNERDRAW

これらのフラグはサポートされておらず、指定すると IContextMenuCallback::AddItemE_INVALIDARG を返します。

MF_SEPARATOR

水平の区切り線を描画します。

MF_SEPARATOR を設定したメニュー項目を追加できるのは、 IContextMenuProvider インターフェイスだけです。

次のフラグは、Windows API における動作と同じように機能します。

MF_CHECKED

メニュー項目にチェックを付けます。

MF_DISABLED

メニュー項目を無効にして選択できないようにしますが、グレー表示にはしません。

MF_ENABLED

メニュー項目を有効にして選択できるようにし、グレー表示の状態から元に戻します。

MF_GRAYED

メニュー項目を無効にし、グレー表示にして選択できないようにします。

MF_MENUBARBREAK

メニューバーに対する MF_MENUBREAK フラグと同じように機能します。ドロップダウンメニュー、サブメニュー、またはショートカットメニューの場合、新しい列は元の列と垂直線で区切られます。

MF_MENUBREAK

列を線で区切らずに、項目を新しい行 (メニューバーの場合) または新しい列 (ドロップダウンメニュー、サブメニュー、またはショートカットメニューの場合) に配置します。

MF_UNCHECKED

項目にチェックを付けません (既定)。

次の各グループのフラグは、同時に使用することはできません。

fSpecialFlagsINT4+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

lCommandIDlInsertionPointID を除く他のすべてのパラメーターを無視します。これにより、lInsertionPointID で識別される挿入ポイントまたはサブメニューの末尾に、新しい挿入ポイントが作成されます。

後続の呼び出しでは、この呼び出しの lCommandID パラメーターを lInsertionPointID として使用し、メニュー内のこの位置に独自のメニュー項目、サブメニュー、または挿入ポイントを挿入できます。

CCM_SPECIAL_TESTONLY = 0x0010

項目のパラメーターを検証しますが、メニュー項目は追加しません。追加が成功したかどうかを示す結果コードを返します。

公式ドキュメント

CONTEXTMENUITEM 構造体は、新しいメニュー項目、サブメニュー、または挿入ポイントを定義するために、 IContextMenuCallback::AddItem メソッド、または (IContextMenuCallback から継承された) IContextMenuProvider::AddItem メソッドに渡されます。コンテキストメニューはルートから順に構築され、 新しい項目はそれぞれ、挿入先となるサブメニューまたは挿入ポイントの末尾に追加されます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 Structure
import 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: int32
struct 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