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

IMESTRUCT

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

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

フィールド

フィールドサイズx64x86説明
fncDWORD4+0+0IME機能(関数)コードを示す値。
wParamWPARAM8/4+8+4汎用パラメータ(WPARAM)。fncにより意味が異なる。
wCountDWORD4+16+8処理対象の要素数。
dchSourceDWORD4+20+12ソースデータの文字オフセット。
dchDestDWORD4+24+16デスティネーションデータの文字オフセット。
lParam1LPARAM8/4+32+20追加パラメータ1(LPARAM)。
lParam2LPARAM8/4+40+24追加パラメータ2(LPARAM)。
lParam3LPARAM8/4+48+28追加パラメータ3(LPARAM)。

各言語での定義

#include <windows.h>

// IMESTRUCT  (x64 56 / x86 32 バイト)
typedef struct IMESTRUCT {
    DWORD fnc;
    WPARAM wParam;
    DWORD wCount;
    DWORD dchSource;
    DWORD dchDest;
    LPARAM lParam1;
    LPARAM lParam2;
    LPARAM lParam3;
} IMESTRUCT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMESTRUCT
{
    public uint fnc;
    public UIntPtr wParam;
    public uint wCount;
    public uint dchSource;
    public uint dchDest;
    public IntPtr lParam1;
    public IntPtr lParam2;
    public IntPtr lParam3;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMESTRUCT
    Public fnc As UInteger
    Public wParam As UIntPtr
    Public wCount As UInteger
    Public dchSource As UInteger
    Public dchDest As UInteger
    Public lParam1 As IntPtr
    Public lParam2 As IntPtr
    Public lParam3 As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class IMESTRUCT(ctypes.Structure):
    _fields_ = [
        ("fnc", wintypes.DWORD),
        ("wParam", ctypes.c_size_t),
        ("wCount", wintypes.DWORD),
        ("dchSource", wintypes.DWORD),
        ("dchDest", wintypes.DWORD),
        ("lParam1", ctypes.c_ssize_t),
        ("lParam2", ctypes.c_ssize_t),
        ("lParam3", ctypes.c_ssize_t),
    ]
#[repr(C)]
pub struct IMESTRUCT {
    pub fnc: u32,
    pub wParam: usize,
    pub wCount: u32,
    pub dchSource: u32,
    pub dchDest: u32,
    pub lParam1: isize,
    pub lParam2: isize,
    pub lParam3: isize,
}
import "golang.org/x/sys/windows"

type IMESTRUCT struct {
	fnc uint32
	wParam uintptr
	wCount uint32
	dchSource uint32
	dchDest uint32
	lParam1 uintptr
	lParam2 uintptr
	lParam3 uintptr
}
type
  IMESTRUCT = record
    fnc: DWORD;
    wParam: NativeUInt;
    wCount: DWORD;
    dchSource: DWORD;
    dchDest: DWORD;
    lParam1: NativeInt;
    lParam2: NativeInt;
    lParam3: NativeInt;
  end;
const IMESTRUCT = extern struct {
    fnc: u32,
    wParam: usize,
    wCount: u32,
    dchSource: u32,
    dchDest: u32,
    lParam1: isize,
    lParam2: isize,
    lParam3: isize,
};
type
  IMESTRUCT {.bycopy.} = object
    fnc: uint32
    wParam: uint
    wCount: uint32
    dchSource: uint32
    dchDest: uint32
    lParam1: int
    lParam2: int
    lParam3: int
struct IMESTRUCT
{
    uint fnc;
    size_t wParam;
    uint wCount;
    uint dchSource;
    uint dchDest;
    ptrdiff_t lParam1;
    ptrdiff_t lParam2;
    ptrdiff_t lParam3;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IMESTRUCT サイズ: 32 バイト(x86)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; fnc : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; wParam : WPARAM (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; wCount : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dchSource : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dchDest : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; lParam1 : LPARAM (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; lParam2 : LPARAM (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; lParam3 : LPARAM (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IMESTRUCT サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; fnc : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; wParam : WPARAM (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; wCount : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dchSource : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dchDest : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; lParam1 : LPARAM (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; lParam2 : LPARAM (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; lParam3 : LPARAM (+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 IMESTRUCT
    #field int fnc
    #field intptr wParam
    #field int wCount
    #field int dchSource
    #field int dchDest
    #field intptr lParam1
    #field intptr lParam2
    #field intptr lParam3
#endstruct

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