Win32 API 日本語リファレンス
ホームDevices.HumanInterfaceDevice › DIACTIONFORMATA

DIACTIONFORMATA

構造体
サイズx64: 336 バイト / x86: 328 バイト

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

フィールド

フィールドサイズx64x86説明
dwSizeDWORD4+0+0この構造体のバイトサイズ。
dwActionSizeDWORD4+4+4各DIACTION要素のバイトサイズ。
dwDataSizeDWORD4+8+8アクションデータ全体のバイトサイズ。
dwNumActionsDWORD4+12+12rgoAction配列に含まれるアクション数。
rgoActionDIACTIONA*8/4+16+16アクション定義の配列(DIACTIONA)へのポインター。
guidActionMapGUID16+24+20このアクションマップを識別するGUID。
dwGenreDWORD4+40+36アプリケーションのジャンルを示す識別値。
dwBufferSizeDWORD4+44+40デバイスのバッファーモード用バッファーサイズ。
lAxisMinINT4+48+44軸値の最小値(範囲の下限)。
lAxisMaxINT4+52+48軸値の最大値(範囲の上限)。
hInstStringHINSTANCE8/4+56+52文字列リソースを含むモジュールのインスタンスハンドル。
ftTimeStampFILETIME8+64+56アクションマップ最終更新のタイムスタンプ。
dwCRCDWORD4+72+64アクションマップ内容のCRC検証値。
tszActionMapCHAR260+76+68アクションマップの表示名を示すASCII文字列。

各言語での定義

#include <windows.h>

// FILETIME  (x64 8 / x86 8 バイト)
typedef struct FILETIME {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME;

// DIACTIONFORMATA  (x64 336 / x86 328 バイト)
typedef struct DIACTIONFORMATA {
    DWORD dwSize;
    DWORD dwActionSize;
    DWORD dwDataSize;
    DWORD dwNumActions;
    DIACTIONA* rgoAction;
    GUID guidActionMap;
    DWORD dwGenre;
    DWORD dwBufferSize;
    INT lAxisMin;
    INT lAxisMax;
    HINSTANCE hInstString;
    FILETIME ftTimeStamp;
    DWORD dwCRC;
    CHAR tszActionMap[260];
} DIACTIONFORMATA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FILETIME
{
    public uint dwLowDateTime;
    public uint dwHighDateTime;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DIACTIONFORMATA
{
    public uint dwSize;
    public uint dwActionSize;
    public uint dwDataSize;
    public uint dwNumActions;
    public IntPtr rgoAction;
    public Guid guidActionMap;
    public uint dwGenre;
    public uint dwBufferSize;
    public int lAxisMin;
    public int lAxisMax;
    public IntPtr hInstString;
    public FILETIME ftTimeStamp;
    public uint dwCRC;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)] public sbyte[] tszActionMap;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FILETIME
    Public dwLowDateTime As UInteger
    Public dwHighDateTime As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DIACTIONFORMATA
    Public dwSize As UInteger
    Public dwActionSize As UInteger
    Public dwDataSize As UInteger
    Public dwNumActions As UInteger
    Public rgoAction As IntPtr
    Public guidActionMap As Guid
    Public dwGenre As UInteger
    Public dwBufferSize As UInteger
    Public lAxisMin As Integer
    Public lAxisMax As Integer
    Public hInstString As IntPtr
    Public ftTimeStamp As FILETIME
    Public dwCRC As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=260)> Public tszActionMap() As SByte
End Structure
import ctypes
from ctypes import wintypes

class FILETIME(ctypes.Structure):
    _fields_ = [
        ("dwLowDateTime", wintypes.DWORD),
        ("dwHighDateTime", wintypes.DWORD),
    ]

class DIACTIONFORMATA(ctypes.Structure):
    _fields_ = [
        ("dwSize", wintypes.DWORD),
        ("dwActionSize", wintypes.DWORD),
        ("dwDataSize", wintypes.DWORD),
        ("dwNumActions", wintypes.DWORD),
        ("rgoAction", ctypes.c_void_p),
        ("guidActionMap", GUID),
        ("dwGenre", wintypes.DWORD),
        ("dwBufferSize", wintypes.DWORD),
        ("lAxisMin", ctypes.c_int),
        ("lAxisMax", ctypes.c_int),
        ("hInstString", ctypes.c_void_p),
        ("ftTimeStamp", FILETIME),
        ("dwCRC", wintypes.DWORD),
        ("tszActionMap", ctypes.c_byte * 260),
    ]
#[repr(C)]
pub struct FILETIME {
    pub dwLowDateTime: u32,
    pub dwHighDateTime: u32,
}

#[repr(C)]
pub struct DIACTIONFORMATA {
    pub dwSize: u32,
    pub dwActionSize: u32,
    pub dwDataSize: u32,
    pub dwNumActions: u32,
    pub rgoAction: *mut core::ffi::c_void,
    pub guidActionMap: GUID,
    pub dwGenre: u32,
    pub dwBufferSize: u32,
    pub lAxisMin: i32,
    pub lAxisMax: i32,
    pub hInstString: *mut core::ffi::c_void,
    pub ftTimeStamp: FILETIME,
    pub dwCRC: u32,
    pub tszActionMap: [i8; 260],
}
import "golang.org/x/sys/windows"

type FILETIME struct {
	dwLowDateTime uint32
	dwHighDateTime uint32
}

type DIACTIONFORMATA struct {
	dwSize uint32
	dwActionSize uint32
	dwDataSize uint32
	dwNumActions uint32
	rgoAction uintptr
	guidActionMap windows.GUID
	dwGenre uint32
	dwBufferSize uint32
	lAxisMin int32
	lAxisMax int32
	hInstString uintptr
	ftTimeStamp FILETIME
	dwCRC uint32
	tszActionMap [260]int8
}
type
  FILETIME = record
    dwLowDateTime: DWORD;
    dwHighDateTime: DWORD;
  end;

  DIACTIONFORMATA = record
    dwSize: DWORD;
    dwActionSize: DWORD;
    dwDataSize: DWORD;
    dwNumActions: DWORD;
    rgoAction: Pointer;
    guidActionMap: TGUID;
    dwGenre: DWORD;
    dwBufferSize: DWORD;
    lAxisMin: Integer;
    lAxisMax: Integer;
    hInstString: Pointer;
    ftTimeStamp: FILETIME;
    dwCRC: DWORD;
    tszActionMap: array[0..259] of Shortint;
  end;
const FILETIME = extern struct {
    dwLowDateTime: u32,
    dwHighDateTime: u32,
};

const DIACTIONFORMATA = extern struct {
    dwSize: u32,
    dwActionSize: u32,
    dwDataSize: u32,
    dwNumActions: u32,
    rgoAction: ?*anyopaque,
    guidActionMap: GUID,
    dwGenre: u32,
    dwBufferSize: u32,
    lAxisMin: i32,
    lAxisMax: i32,
    hInstString: ?*anyopaque,
    ftTimeStamp: FILETIME,
    dwCRC: u32,
    tszActionMap: [260]i8,
};
type
  FILETIME {.bycopy.} = object
    dwLowDateTime: uint32
    dwHighDateTime: uint32

  DIACTIONFORMATA {.bycopy.} = object
    dwSize: uint32
    dwActionSize: uint32
    dwDataSize: uint32
    dwNumActions: uint32
    rgoAction: pointer
    guidActionMap: GUID
    dwGenre: uint32
    dwBufferSize: uint32
    lAxisMin: int32
    lAxisMax: int32
    hInstString: pointer
    ftTimeStamp: FILETIME
    dwCRC: uint32
    tszActionMap: array[260, int8]
struct FILETIME
{
    uint dwLowDateTime;
    uint dwHighDateTime;
}

struct DIACTIONFORMATA
{
    uint dwSize;
    uint dwActionSize;
    uint dwDataSize;
    uint dwNumActions;
    void* rgoAction;
    GUID guidActionMap;
    uint dwGenre;
    uint dwBufferSize;
    int lAxisMin;
    int lAxisMax;
    void* hInstString;
    FILETIME ftTimeStamp;
    uint dwCRC;
    byte[260] tszActionMap;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DIACTIONFORMATA サイズ: 328 バイト(x86)
dim st, 82    ; 4byte整数×82(構造体サイズ 328 / 4 切り上げ)
; dwSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwActionSize : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwDataSize : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwNumActions : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; rgoAction : DIACTIONA* (+16, 4byte)  varptr(st)+16 を基点に操作(4byte:入れ子/配列)
; guidActionMap : GUID (+20, 16byte)  varptr(st)+20 を基点に操作(16byte:入れ子/配列)
; dwGenre : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; dwBufferSize : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; lAxisMin : INT (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; lAxisMax : INT (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; hInstString : HINSTANCE (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ftTimeStamp : FILETIME (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; dwCRC : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; tszActionMap : CHAR (+68, 260byte)  varptr(st)+68 を基点に操作(260byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DIACTIONFORMATA サイズ: 336 バイト(x64)
dim st, 84    ; 4byte整数×84(構造体サイズ 336 / 4 切り上げ)
; dwSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwActionSize : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwDataSize : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwNumActions : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; rgoAction : DIACTIONA* (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; guidActionMap : GUID (+24, 16byte)  varptr(st)+24 を基点に操作(16byte:入れ子/配列)
; dwGenre : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; dwBufferSize : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; lAxisMin : INT (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; lAxisMax : INT (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; hInstString : HINSTANCE (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; ftTimeStamp : FILETIME (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; dwCRC : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; tszActionMap : CHAR (+76, 260byte)  varptr(st)+76 を基点に操作(260byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global FILETIME
    #field int dwLowDateTime
    #field int dwHighDateTime
#endstruct

#defstruct global DIACTIONFORMATA
    #field int dwSize
    #field int dwActionSize
    #field int dwDataSize
    #field int dwNumActions
    #field intptr rgoAction
    #field GUID guidActionMap
    #field int dwGenre
    #field int dwBufferSize
    #field int lAxisMin
    #field int lAxisMax
    #field intptr hInstString
    #field FILETIME ftTimeStamp
    #field int dwCRC
    #field byte tszActionMap 260
#endstruct

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