ホーム › Devices.HumanInterfaceDevice › DIACTIONFORMATA
DIACTIONFORMATA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| dwSize | DWORD | 4 | +0 | +0 | この構造体のバイトサイズ。 |
| dwActionSize | DWORD | 4 | +4 | +4 | 各DIACTION要素のバイトサイズ。 |
| dwDataSize | DWORD | 4 | +8 | +8 | アクションデータ全体のバイトサイズ。 |
| dwNumActions | DWORD | 4 | +12 | +12 | rgoAction配列に含まれるアクション数。 |
| rgoAction | DIACTIONA* | 8/4 | +16 | +16 | アクション定義の配列(DIACTIONA)へのポインター。 |
| guidActionMap | GUID | 16 | +24 | +20 | このアクションマップを識別するGUID。 |
| dwGenre | DWORD | 4 | +40 | +36 | アプリケーションのジャンルを示す識別値。 |
| dwBufferSize | DWORD | 4 | +44 | +40 | デバイスのバッファーモード用バッファーサイズ。 |
| lAxisMin | INT | 4 | +48 | +44 | 軸値の最小値(範囲の下限)。 |
| lAxisMax | INT | 4 | +52 | +48 | 軸値の最大値(範囲の上限)。 |
| hInstString | HINSTANCE | 8/4 | +56 | +52 | 文字列リソースを含むモジュールのインスタンスハンドル。 |
| ftTimeStamp | FILETIME | 8 | +64 | +56 | アクションマップ最終更新のタイムスタンプ。 |
| dwCRC | DWORD | 4 | +72 | +64 | アクションマップ内容のCRC検証値。 |
| tszActionMap | CHAR | 260 | +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 Structureimport 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