ホーム › System.DataExchange › MONMSGSTRUCT
MONMSGSTRUCT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cb | DWORD | 4 | +0 | +0 | この構造体のバイトサイズ。 |
| hwndTo | HWND | 8/4 | +8 | +4 | メッセージの宛先ウィンドウハンドル。 |
| dwTime | DWORD | 4 | +16 | +8 | メッセージ送信時刻(Windows時間)。 |
| hTask | HANDLE | 8/4 | +24 | +12 | メッセージを送信したタスク(スレッド)のハンドル。 |
| wMsg | DWORD | 4 | +32 | +16 | DDEメッセージの識別子。 |
| wParam | WPARAM | 8/4 | +40 | +20 | メッセージのwParam値。 |
| lParam | LPARAM | 8/4 | +48 | +24 | メッセージのlParam値。 |
| dmhd | DDEML_MSG_HOOK_DATA | 56/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 Structureimport 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_DATAstruct 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