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

MONMSGSTRUCT

構造体
サイズx64: 112 バイト / x86: 72 バイト

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

フィールド

フィールドサイズx64x86説明
cbDWORD4+0+0この構造体のバイトサイズ。
hwndToHWND8/4+8+4メッセージの宛先ウィンドウハンドル。
dwTimeDWORD4+16+8メッセージ送信時刻(Windows時間)。
hTaskHANDLE8/4+24+12メッセージを送信したタスク(スレッド)のハンドル。
wMsgDWORD4+32+16DDEメッセージの識別子。
wParamWPARAM8/4+40+20メッセージのwParam値。
lParamLPARAM8/4+48+24メッセージのlParam値。
dmhdDDEML_MSG_HOOK_DATA56/44+56+28メッセージフックデータ(DDEML_MSG_HOOK_DATA)。

各言語での定義

#include <windows.h>

// DDEML_MSG_HOOK_DATA  (x64 56 / x86 44 バイト)
typedef struct DDEML_MSG_HOOK_DATA {
    UINT_PTR uiLo;
    UINT_PTR uiHi;
    DWORD cbData;
    DWORD Data[8];
} DDEML_MSG_HOOK_DATA;

// MONMSGSTRUCT  (x64 112 / x86 72 バイト)
typedef struct MONMSGSTRUCT {
    DWORD cb;
    HWND hwndTo;
    DWORD dwTime;
    HANDLE hTask;
    DWORD wMsg;
    WPARAM wParam;
    LPARAM lParam;
    DDEML_MSG_HOOK_DATA dmhd;
} MONMSGSTRUCT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DDEML_MSG_HOOK_DATA
{
    public UIntPtr uiLo;
    public UIntPtr uiHi;
    public uint cbData;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint[] Data;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MONMSGSTRUCT
{
    public uint cb;
    public IntPtr hwndTo;
    public uint dwTime;
    public IntPtr hTask;
    public uint wMsg;
    public UIntPtr wParam;
    public IntPtr lParam;
    public DDEML_MSG_HOOK_DATA dmhd;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DDEML_MSG_HOOK_DATA
    Public uiLo As UIntPtr
    Public uiHi As UIntPtr
    Public cbData As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public Data() As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure MONMSGSTRUCT
    Public cb As UInteger
    Public hwndTo As IntPtr
    Public dwTime As UInteger
    Public hTask As IntPtr
    Public wMsg As UInteger
    Public wParam As UIntPtr
    Public lParam As IntPtr
    Public dmhd As DDEML_MSG_HOOK_DATA
End Structure
import ctypes
from ctypes import wintypes

class DDEML_MSG_HOOK_DATA(ctypes.Structure):
    _fields_ = [
        ("uiLo", ctypes.c_size_t),
        ("uiHi", ctypes.c_size_t),
        ("cbData", wintypes.DWORD),
        ("Data", wintypes.DWORD * 8),
    ]

class MONMSGSTRUCT(ctypes.Structure):
    _fields_ = [
        ("cb", wintypes.DWORD),
        ("hwndTo", ctypes.c_void_p),
        ("dwTime", wintypes.DWORD),
        ("hTask", ctypes.c_void_p),
        ("wMsg", wintypes.DWORD),
        ("wParam", ctypes.c_size_t),
        ("lParam", ctypes.c_ssize_t),
        ("dmhd", DDEML_MSG_HOOK_DATA),
    ]
#[repr(C)]
pub struct DDEML_MSG_HOOK_DATA {
    pub uiLo: usize,
    pub uiHi: usize,
    pub cbData: u32,
    pub Data: [u32; 8],
}

#[repr(C)]
pub struct MONMSGSTRUCT {
    pub cb: u32,
    pub hwndTo: *mut core::ffi::c_void,
    pub dwTime: u32,
    pub hTask: *mut core::ffi::c_void,
    pub wMsg: u32,
    pub wParam: usize,
    pub lParam: isize,
    pub dmhd: DDEML_MSG_HOOK_DATA,
}
import "golang.org/x/sys/windows"

type DDEML_MSG_HOOK_DATA struct {
	uiLo uintptr
	uiHi uintptr
	cbData uint32
	Data [8]uint32
}

type MONMSGSTRUCT struct {
	cb uint32
	hwndTo uintptr
	dwTime uint32
	hTask uintptr
	wMsg uint32
	wParam uintptr
	lParam uintptr
	dmhd DDEML_MSG_HOOK_DATA
}
type
  DDEML_MSG_HOOK_DATA = record
    uiLo: NativeUInt;
    uiHi: NativeUInt;
    cbData: DWORD;
    Data: array[0..7] of DWORD;
  end;

  MONMSGSTRUCT = record
    cb: DWORD;
    hwndTo: Pointer;
    dwTime: DWORD;
    hTask: Pointer;
    wMsg: DWORD;
    wParam: NativeUInt;
    lParam: NativeInt;
    dmhd: DDEML_MSG_HOOK_DATA;
  end;
const DDEML_MSG_HOOK_DATA = extern struct {
    uiLo: usize,
    uiHi: usize,
    cbData: u32,
    Data: [8]u32,
};

const MONMSGSTRUCT = extern struct {
    cb: u32,
    hwndTo: ?*anyopaque,
    dwTime: u32,
    hTask: ?*anyopaque,
    wMsg: u32,
    wParam: usize,
    lParam: isize,
    dmhd: DDEML_MSG_HOOK_DATA,
};
type
  DDEML_MSG_HOOK_DATA {.bycopy.} = object
    uiLo: uint
    uiHi: uint
    cbData: uint32
    Data: array[8, uint32]

  MONMSGSTRUCT {.bycopy.} = object
    cb: uint32
    hwndTo: pointer
    dwTime: uint32
    hTask: pointer
    wMsg: uint32
    wParam: uint
    lParam: int
    dmhd: DDEML_MSG_HOOK_DATA
struct DDEML_MSG_HOOK_DATA
{
    size_t uiLo;
    size_t uiHi;
    uint cbData;
    uint[8] Data;
}

struct MONMSGSTRUCT
{
    uint cb;
    void* hwndTo;
    uint dwTime;
    void* hTask;
    uint wMsg;
    size_t wParam;
    ptrdiff_t lParam;
    DDEML_MSG_HOOK_DATA dmhd;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; MONMSGSTRUCT サイズ: 72 バイト(x86)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; cb : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; hwndTo : HWND (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwTime : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; hTask : HANDLE (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; wMsg : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; wParam : WPARAM (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; lParam : LPARAM (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; dmhd : DDEML_MSG_HOOK_DATA (+28, 44byte)  varptr(st)+28 を基点に操作(44byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; MONMSGSTRUCT サイズ: 112 バイト(x64)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; cb : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; hwndTo : HWND (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; dwTime : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; hTask : HANDLE (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; wMsg : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; wParam : WPARAM (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; lParam : LPARAM (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; dmhd : DDEML_MSG_HOOK_DATA (+56, 56byte)  varptr(st)+56 を基点に操作(56byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global DDEML_MSG_HOOK_DATA
    #field intptr uiLo
    #field intptr uiHi
    #field int cbData
    #field int Data 8
#endstruct

#defstruct global MONMSGSTRUCT
    #field int cb
    #field intptr hwndTo
    #field int dwTime
    #field intptr hTask
    #field int wMsg
    #field intptr wParam
    #field intptr lParam
    #field DDEML_MSG_HOOK_DATA dmhd
#endstruct

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