Win32 API 日本語リファレンス
ホームUI.Shell › CMINVOKECOMMANDINFO

CMINVOKECOMMANDINFO

構造体
サイズx64: 56 バイト / x86: 36 バイト

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

フィールド

フィールドサイズx64x86説明
cbSizeDWORD4+0+0この構造体のサイズ (バイト単位)。
fMaskDWORD4+4+4

0、または次のフラグのうち 1 つ以上を指定します。

CMIC_MASK_HOTKEY

dwHotKey メンバーが有効です。

CMIC_MASK_ICON

hIcon メンバーが有効です。Windows Vista 以降では、このフラグは使用されません。

CMIC_MASK_FLAG_NO_UI

コマンドの実行中に、システムがユーザー インターフェイス要素 (エラー メッセージなど) を表示しないようにします。

CMIC_MASK_NO_CONSOLE

ショートカット メニュー ハンドラーが新しいプロセスを作成する必要がある場合、通常は新しいコンソールが作成されます。CMIC_MASK_NO_CONSOLE フラグを設定すると、新しいコンソールの作成が抑止されます。

CMIC_MASK_FLAG_SEP_VDM

このフラグは、16 ビットの Windows ベース アプリケーションを参照する場合にのみ有効です。設定した場合、ショートカットが指すアプリケーションはプライベートな仮想 DOS マシン (VDM) 内で実行されます。「解説」を参照してください。

CMIC_MASK_ASYNCOK

制御を返す前に、DDE 会話が終了するまで待機します。

CMIC_MASK_NOASYNC

Windows Vista 以降。 IContextMenu::InvokeCommand の実装は同期的であり、処理が完了するまで制御を返さないようにする必要があります。これは推奨される動作であるため、このフラグを指定する呼び出し側アプリケーションは、呼び出すバーブの実装に精通していない場合、この要求が守られることを保証できません。

CMIC_MASK_SHIFT_DOWN

SHIFT キーが押されています。バーブの呼び出し以降に変化している可能性があるキーボードの現在の状態をポーリングする代わりに、このフラグを使用してください。

CMIC_MASK_CONTROL_DOWN

CTRL キーが押されています。バーブの呼び出し以降に変化している可能性があるキーボードの現在の状態をポーリングする代わりに、このフラグを使用してください。

CMIC_MASK_FLAG_LOG_USAGE

IContextMenu::InvokeCommand の実装が、「最近使ったドキュメント」メニューなどの機能のために、呼び出された項目を記録しておきたい場合があることを示します。

CMIC_MASK_NOZONECHECKS

ゾーン チェックを実行しません。このフラグにより、ShellExecuteExIAttachmentExecute によって設定されたゾーン チェックをバイパスできます。

hwndHWND8/4+8+8ショートカット メニューの所有者であるウィンドウへのハンドル。拡張機能は、表示するメッセージ ボックスやダイアログ ボックスの所有者としてこのハンドルを使用することもできます。
lpVerbLPSTR8/4+16+12

実行するコマンドの言語非依存の名前を指定する、NULL で終わる文字列のアドレス。アプリケーションによってコマンドがアクティブ化される場合、このメンバーは通常は文字列です。システムは、次のコマンド文字列に対して定義済みの定数値を提供します。

定数 コマンド文字列
CMDSTR_RUNAS "RunAs"
CMDSTR_PRINT "Print"
CMDSTR_PREVIEW "Preview"
CMDSTR_OPEN "Open"

これは固定のセットではありません。コンテキスト メニュー ハンドラーが新しい正規のバーブを考案し、アプリケーションからそれらを呼び出すことができます。

正規のバーブが存在するにもかかわらずメニュー ハンドラーがそのバーブを実装していない場合は、次のハンドラーがこのバーブを処理できるように、失敗コードを返さなければなりません。これを行わないと、ShellExecute をはじめとするシステムの機能が損なわれます。

また、このパラメーターにはポインターの代わりに MAKEINTRESOURCE(offset) を指定することもできます。ここで offset は、実行するコマンドのメニュー識別子のオフセットです。実装では、IS_INTRESOURCE マクロを使用して、この代替形式が使用されていることを検出できます。シェルは、ユーザーがメニュー コマンドを選択したときにこの代替形式を使用します。

lpParametersLPSTR8/4+24+16コマンドに渡されるパラメーターを含む省略可能な文字列。この文字列の形式は、呼び出されるコマンドによって決まります。このメンバーは、シェル拡張によって挿入されたメニュー項目では常に NULL です。
lpDirectoryLPSTR8/4+32+20省略可能な作業ディレクトリ名。このメンバーは、シェル拡張によって挿入されたメニュー項目では常に NULL です。
nShowINT4+40+24コマンドがウィンドウを表示する場合やアプリケーションを開始する場合に、ShowWindow 関数に渡す SW_ 値のセット。
dwHotKeyDWORD4+44+28コマンドによってアクティブ化されるアプリケーションに割り当てる、省略可能なキーボード ショートカット。fMask パラメーターで CMIC_MASK_HOTKEY が指定されていない場合、このメンバーは無視されます。
hIconHANDLE8/4+48+32コマンドによってアクティブ化されるアプリケーションに使用するアイコン。fMask メンバーで CMIC_MASK_ICON が指定されていない場合、このメンバーは無視されます。

公式ドキュメント

ショートカット メニュー コマンドを呼び出すために IContextMenu::InvokeCommand が必要とする情報を格納します。

解説(Remarks)

IContextMenu::InvokeCommand の宣言では pici パラメーターに CMINVOKECOMMANDINFO 構造体が指定されていますが、CMINVOKECOMMANDINFOEX 構造体を受け取ることもできます。このメソッドを実装する場合は、cbSize を調べて、どちらの構造体が渡されたのかを判断する必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// CMINVOKECOMMANDINFO  (x64 56 / x86 36 バイト)
typedef struct CMINVOKECOMMANDINFO {
    DWORD cbSize;
    DWORD fMask;
    HWND hwnd;
    LPSTR lpVerb;
    LPSTR lpParameters;
    LPSTR lpDirectory;
    INT nShow;
    DWORD dwHotKey;
    HANDLE hIcon;
} CMINVOKECOMMANDINFO;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CMINVOKECOMMANDINFO
{
    public uint cbSize;
    public uint fMask;
    public IntPtr hwnd;
    public IntPtr lpVerb;
    public IntPtr lpParameters;
    public IntPtr lpDirectory;
    public int nShow;
    public uint dwHotKey;
    public IntPtr hIcon;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CMINVOKECOMMANDINFO
    Public cbSize As UInteger
    Public fMask As UInteger
    Public hwnd As IntPtr
    Public lpVerb As IntPtr
    Public lpParameters As IntPtr
    Public lpDirectory As IntPtr
    Public nShow As Integer
    Public dwHotKey As UInteger
    Public hIcon As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class CMINVOKECOMMANDINFO(ctypes.Structure):
    _fields_ = [
        ("cbSize", wintypes.DWORD),
        ("fMask", wintypes.DWORD),
        ("hwnd", ctypes.c_void_p),
        ("lpVerb", ctypes.c_void_p),
        ("lpParameters", ctypes.c_void_p),
        ("lpDirectory", ctypes.c_void_p),
        ("nShow", ctypes.c_int),
        ("dwHotKey", wintypes.DWORD),
        ("hIcon", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct CMINVOKECOMMANDINFO {
    pub cbSize: u32,
    pub fMask: u32,
    pub hwnd: *mut core::ffi::c_void,
    pub lpVerb: *mut core::ffi::c_void,
    pub lpParameters: *mut core::ffi::c_void,
    pub lpDirectory: *mut core::ffi::c_void,
    pub nShow: i32,
    pub dwHotKey: u32,
    pub hIcon: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type CMINVOKECOMMANDINFO struct {
	cbSize uint32
	fMask uint32
	hwnd uintptr
	lpVerb uintptr
	lpParameters uintptr
	lpDirectory uintptr
	nShow int32
	dwHotKey uint32
	hIcon uintptr
}
type
  CMINVOKECOMMANDINFO = record
    cbSize: DWORD;
    fMask: DWORD;
    hwnd: Pointer;
    lpVerb: Pointer;
    lpParameters: Pointer;
    lpDirectory: Pointer;
    nShow: Integer;
    dwHotKey: DWORD;
    hIcon: Pointer;
  end;
const CMINVOKECOMMANDINFO = extern struct {
    cbSize: u32,
    fMask: u32,
    hwnd: ?*anyopaque,
    lpVerb: ?*anyopaque,
    lpParameters: ?*anyopaque,
    lpDirectory: ?*anyopaque,
    nShow: i32,
    dwHotKey: u32,
    hIcon: ?*anyopaque,
};
type
  CMINVOKECOMMANDINFO {.bycopy.} = object
    cbSize: uint32
    fMask: uint32
    hwnd: pointer
    lpVerb: pointer
    lpParameters: pointer
    lpDirectory: pointer
    nShow: int32
    dwHotKey: uint32
    hIcon: pointer
struct CMINVOKECOMMANDINFO
{
    uint cbSize;
    uint fMask;
    void* hwnd;
    void* lpVerb;
    void* lpParameters;
    void* lpDirectory;
    int nShow;
    uint dwHotKey;
    void* hIcon;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CMINVOKECOMMANDINFO サイズ: 36 バイト(x86)
dim st, 9    ; 4byte整数×9(構造体サイズ 36 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; fMask : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; hwnd : HWND (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; lpVerb : LPSTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; lpParameters : LPSTR (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; lpDirectory : LPSTR (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; nShow : INT (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; dwHotKey : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; hIcon : HANDLE (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CMINVOKECOMMANDINFO サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; fMask : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; hwnd : HWND (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; lpVerb : LPSTR (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; lpParameters : LPSTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; lpDirectory : LPSTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; nShow : INT (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; dwHotKey : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; hIcon : HANDLE (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global CMINVOKECOMMANDINFO
    #field int cbSize
    #field int fMask
    #field intptr hwnd
    #field intptr lpVerb
    #field intptr lpParameters
    #field intptr lpDirectory
    #field int nShow
    #field int dwHotKey
    #field intptr hIcon
#endstruct

stdim st, CMINVOKECOMMANDINFO        ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize