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

HIDP_BUTTON_CAPS

構造体
サイズx64: 64 バイト / x86: 60 バイト

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

フィールド

フィールドサイズx64x86説明
UsagePageWORD2+0+0ボタンが属するHID Usage Page値。
ReportIDBYTE1+2+2ボタンが属するHIDレポートID。
IsAliasBOOLEAN1+3+3別のキャップの別名かを示す真偽値。
BitFieldWORD2+4+4HIDレポート記述子のビットフィールド属性値。
LinkCollectionWORD2+6+6ボタンが属するリンクコレクションのインデックス。
LinkUsageWORD2+8+8リンクコレクションのUsage値。
LinkUsagePageWORD2+10+10リンクコレクションのUsage Page値。
IsRangeBOOLEAN1+12+12Usageが範囲指定かを示す真偽値。
IsStringRangeBOOLEAN1+13+13文字列インデックスが範囲指定かを示す真偽値。
IsDesignatorRangeBOOLEAN1+14+14デジグネーターが範囲指定かを示す真偽値。
IsAbsoluteBOOLEAN1+15+15値が絶対値(対相対値)かを示す真偽値。
ReportCountWORD2+16+16このキャップに含まれるレポート要素数。
Reserved2WORD2+18+18予約フィールド。使用しない。
ReservedDWORD36+20+20予約フィールド。使用しない。
Anonymous_Anonymous_e__Union8/4+56+56範囲指定/単一指定に応じたUsage情報を保持する無名共用体。

共用体: _Anonymous_e__Union x64 8B / x86 4B

フィールドサイズx64x86
Range_Range_e__Struct8/4+0+0
NotRange_NotRange_e__Struct8/4+0+0

各言語での定義

#include <windows.h>

// HIDP_BUTTON_CAPS  (x64 64 / x86 60 バイト)
typedef struct HIDP_BUTTON_CAPS {
    WORD UsagePage;
    BYTE ReportID;
    BOOLEAN IsAlias;
    WORD BitField;
    WORD LinkCollection;
    WORD LinkUsage;
    WORD LinkUsagePage;
    BOOLEAN IsRange;
    BOOLEAN IsStringRange;
    BOOLEAN IsDesignatorRange;
    BOOLEAN IsAbsolute;
    WORD ReportCount;
    WORD Reserved2;
    DWORD Reserved[9];
    _Anonymous_e__Union Anonymous;
} HIDP_BUTTON_CAPS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct HIDP_BUTTON_CAPS
{
    public ushort UsagePage;
    public byte ReportID;
    [MarshalAs(UnmanagedType.U1)] public bool IsAlias;
    public ushort BitField;
    public ushort LinkCollection;
    public ushort LinkUsage;
    public ushort LinkUsagePage;
    [MarshalAs(UnmanagedType.U1)] public bool IsRange;
    [MarshalAs(UnmanagedType.U1)] public bool IsStringRange;
    [MarshalAs(UnmanagedType.U1)] public bool IsDesignatorRange;
    [MarshalAs(UnmanagedType.U1)] public bool IsAbsolute;
    public ushort ReportCount;
    public ushort Reserved2;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)] public uint[] Reserved;
    public _Anonymous_e__Union Anonymous;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure HIDP_BUTTON_CAPS
    Public UsagePage As UShort
    Public ReportID As Byte
    <MarshalAs(UnmanagedType.U1)> Public IsAlias As Boolean
    Public BitField As UShort
    Public LinkCollection As UShort
    Public LinkUsage As UShort
    Public LinkUsagePage As UShort
    <MarshalAs(UnmanagedType.U1)> Public IsRange As Boolean
    <MarshalAs(UnmanagedType.U1)> Public IsStringRange As Boolean
    <MarshalAs(UnmanagedType.U1)> Public IsDesignatorRange As Boolean
    <MarshalAs(UnmanagedType.U1)> Public IsAbsolute As Boolean
    Public ReportCount As UShort
    Public Reserved2 As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=9)> Public Reserved() As UInteger
    Public Anonymous As _Anonymous_e__Union
End Structure
import ctypes
from ctypes import wintypes

class HIDP_BUTTON_CAPS(ctypes.Structure):
    _fields_ = [
        ("UsagePage", ctypes.c_ushort),
        ("ReportID", ctypes.c_ubyte),
        ("IsAlias", ctypes.c_byte),
        ("BitField", ctypes.c_ushort),
        ("LinkCollection", ctypes.c_ushort),
        ("LinkUsage", ctypes.c_ushort),
        ("LinkUsagePage", ctypes.c_ushort),
        ("IsRange", ctypes.c_byte),
        ("IsStringRange", ctypes.c_byte),
        ("IsDesignatorRange", ctypes.c_byte),
        ("IsAbsolute", ctypes.c_byte),
        ("ReportCount", ctypes.c_ushort),
        ("Reserved2", ctypes.c_ushort),
        ("Reserved", wintypes.DWORD * 9),
        ("Anonymous", _Anonymous_e__Union),
    ]
#[repr(C)]
pub struct HIDP_BUTTON_CAPS {
    pub UsagePage: u16,
    pub ReportID: u8,
    pub IsAlias: u8,
    pub BitField: u16,
    pub LinkCollection: u16,
    pub LinkUsage: u16,
    pub LinkUsagePage: u16,
    pub IsRange: u8,
    pub IsStringRange: u8,
    pub IsDesignatorRange: u8,
    pub IsAbsolute: u8,
    pub ReportCount: u16,
    pub Reserved2: u16,
    pub Reserved: [u32; 9],
    pub Anonymous: _Anonymous_e__Union,
}
import "golang.org/x/sys/windows"

type HIDP_BUTTON_CAPS struct {
	UsagePage uint16
	ReportID byte
	IsAlias byte
	BitField uint16
	LinkCollection uint16
	LinkUsage uint16
	LinkUsagePage uint16
	IsRange byte
	IsStringRange byte
	IsDesignatorRange byte
	IsAbsolute byte
	ReportCount uint16
	Reserved2 uint16
	Reserved [9]uint32
	Anonymous _Anonymous_e__Union
}
type
  HIDP_BUTTON_CAPS = record
    UsagePage: Word;
    ReportID: Byte;
    IsAlias: ByteBool;
    BitField: Word;
    LinkCollection: Word;
    LinkUsage: Word;
    LinkUsagePage: Word;
    IsRange: ByteBool;
    IsStringRange: ByteBool;
    IsDesignatorRange: ByteBool;
    IsAbsolute: ByteBool;
    ReportCount: Word;
    Reserved2: Word;
    Reserved: array[0..8] of DWORD;
    Anonymous: _Anonymous_e__Union;
  end;
const HIDP_BUTTON_CAPS = extern struct {
    UsagePage: u16,
    ReportID: u8,
    IsAlias: u8,
    BitField: u16,
    LinkCollection: u16,
    LinkUsage: u16,
    LinkUsagePage: u16,
    IsRange: u8,
    IsStringRange: u8,
    IsDesignatorRange: u8,
    IsAbsolute: u8,
    ReportCount: u16,
    Reserved2: u16,
    Reserved: [9]u32,
    Anonymous: _Anonymous_e__Union,
};
type
  HIDP_BUTTON_CAPS {.bycopy.} = object
    UsagePage: uint16
    ReportID: uint8
    IsAlias: uint8
    BitField: uint16
    LinkCollection: uint16
    LinkUsage: uint16
    LinkUsagePage: uint16
    IsRange: uint8
    IsStringRange: uint8
    IsDesignatorRange: uint8
    IsAbsolute: uint8
    ReportCount: uint16
    Reserved2: uint16
    Reserved: array[9, uint32]
    Anonymous: _Anonymous_e__Union
struct HIDP_BUTTON_CAPS
{
    ushort UsagePage;
    ubyte ReportID;
    ubyte IsAlias;
    ushort BitField;
    ushort LinkCollection;
    ushort LinkUsage;
    ushort LinkUsagePage;
    ubyte IsRange;
    ubyte IsStringRange;
    ubyte IsDesignatorRange;
    ubyte IsAbsolute;
    ushort ReportCount;
    ushort Reserved2;
    uint[9] Reserved;
    _Anonymous_e__Union Anonymous;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; HIDP_BUTTON_CAPS サイズ: 60 バイト(x86)
dim st, 15    ; 4byte整数×15(構造体サイズ 60 / 4 切り上げ)
; UsagePage : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; ReportID : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; IsAlias : BOOLEAN (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; BitField : WORD (+4, 2byte)  wpoke st,4,値  /  値 = wpeek(st,4)
; LinkCollection : WORD (+6, 2byte)  wpoke st,6,値  /  値 = wpeek(st,6)
; LinkUsage : WORD (+8, 2byte)  wpoke st,8,値  /  値 = wpeek(st,8)
; LinkUsagePage : WORD (+10, 2byte)  wpoke st,10,値  /  値 = wpeek(st,10)
; IsRange : BOOLEAN (+12, 1byte)  poke st,12,値  /  値 = peek(st,12)
; IsStringRange : BOOLEAN (+13, 1byte)  poke st,13,値  /  値 = peek(st,13)
; IsDesignatorRange : BOOLEAN (+14, 1byte)  poke st,14,値  /  値 = peek(st,14)
; IsAbsolute : BOOLEAN (+15, 1byte)  poke st,15,値  /  値 = peek(st,15)
; ReportCount : WORD (+16, 2byte)  wpoke st,16,値  /  値 = wpeek(st,16)
; Reserved2 : WORD (+18, 2byte)  wpoke st,18,値  /  値 = wpeek(st,18)
; Reserved : DWORD (+20, 36byte)  varptr(st)+20 を基点に操作(36byte:入れ子/配列)
; Anonymous : _Anonymous_e__Union (+56, 4byte)  varptr(st)+56 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; HIDP_BUTTON_CAPS サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; UsagePage : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; ReportID : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; IsAlias : BOOLEAN (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; BitField : WORD (+4, 2byte)  wpoke st,4,値  /  値 = wpeek(st,4)
; LinkCollection : WORD (+6, 2byte)  wpoke st,6,値  /  値 = wpeek(st,6)
; LinkUsage : WORD (+8, 2byte)  wpoke st,8,値  /  値 = wpeek(st,8)
; LinkUsagePage : WORD (+10, 2byte)  wpoke st,10,値  /  値 = wpeek(st,10)
; IsRange : BOOLEAN (+12, 1byte)  poke st,12,値  /  値 = peek(st,12)
; IsStringRange : BOOLEAN (+13, 1byte)  poke st,13,値  /  値 = peek(st,13)
; IsDesignatorRange : BOOLEAN (+14, 1byte)  poke st,14,値  /  値 = peek(st,14)
; IsAbsolute : BOOLEAN (+15, 1byte)  poke st,15,値  /  値 = peek(st,15)
; ReportCount : WORD (+16, 2byte)  wpoke st,16,値  /  値 = wpeek(st,16)
; Reserved2 : WORD (+18, 2byte)  wpoke st,18,値  /  値 = wpeek(st,18)
; Reserved : DWORD (+20, 36byte)  varptr(st)+20 を基点に操作(36byte:入れ子/配列)
; Anonymous : _Anonymous_e__Union (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global HIDP_BUTTON_CAPS
    #field short UsagePage
    #field byte ReportID
    #field bool1 IsAlias
    #field short BitField
    #field short LinkCollection
    #field short LinkUsage
    #field short LinkUsagePage
    #field bool1 IsRange
    #field bool1 IsStringRange
    #field bool1 IsDesignatorRange
    #field bool1 IsAbsolute
    #field short ReportCount
    #field short Reserved2
    #field int Reserved 9
    #field byte Anonymous 8
#endstruct

stdim st, HIDP_BUTTON_CAPS        ; NSTRUCT 変数を確保
st->UsagePage = 100
mes "UsagePage=" + st->UsagePage
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。