Microsoft DirectX 8.0 (Visual Basic)

データ出力

ヒューマン インターフェイス デバイスは、入力の生成と同様に出力を認知することができる。そのようなデバイスにデータ パケットを送信するには、DirectInputDevice8.SendDeviceData メソッドを使用する。

SendDeviceData は、反対に DirectInputDevice8.GetDeviceData として表示することができる。SendDeviceData メソッドと同様、GetDeviceData メソッドは、データの基本単位として DIDEVICEOBJECTDATA 型を使用する。この場合、lOfs メンバに含まれるのは、デバイスのデータ形式のオフセットではなく、データに関連付けられたデバイス オブジェクトのインスタンス ID である。この ID は、デバイス オブジェクトを列挙した後に、DirectInputDeviceObjectInstance.GetType により返される値から抽出できる (オフセット識別子は、選択されたデータ形式での入力を提供するデバイス オブジェクトのためだけに存在するので、出力しか認めないオブジェクトは、オフセットを持つことすらない)。lData メンバには、そのオブジェクトに適したデータが含まれる。lTimeStamp および lSequence メンバは使用しない。これらのメンバは、ゼロに設定しなければならない。

デバイスにデータを送るには、最初に DIDEVICEOBJECTDATA 型の配列を設定し、要求された数の要素をデータで埋めてから、使用するアドレスと要素数を SendDeviceData に渡す。異なるデバイス オブジェクトのデータは、デバイスに送られる単一パケットに結合される。

データ パケットの形式は、パケット内の使用されないフィールドの処理方法と同じで、デバイスによって異なる。デバイスによっては、フィールドをオプションとして扱う。つまり、データが提供されない場合、オブジェクトの状態は前と同じである。一般的には、特にデータがフィールドに提供されない場合であっても、すべてのフィールドは重要である。たとえば、単一のキーボード LED にデータを送ると、ほかの 2 つの LED のデータはゼロで、それらの LED はオフであると仮定される。ただし、DISDD_CONTINUE フラグを使用してこの動作を無効にすることができる。この場合は、ほかの 2 つの LED のデータは、最後に送信した値となる。

デバイス オブジェクトの型の識別子は、HID 使用ページと使用コードを DirectInputDevice8.GetObjectInfo に渡した後で取得できる。

次の例では、コードが繰り返し実行される場合、キーボード上の LED は繰り返し点滅する。LED の状態は、データ バイトの上位ビットにより決定されるものとする。デバイス オブジェクト インスタンスの識別子 NumLockIDCapsLockID、および ScrollLockID は以前に取得され、diDevKeyboard は以前に定義された DirectInputDevice8 オブジェクトである。

Private Sub FlashLEDs()
    Const ARRAYSIZE = 4
    Static rgiBits(ARRAYSIZE-1) As Integer
       rgiBits(0) = 1
       rgiBits(1) = 2
       rgiBits(2) = 4
       rgiBits(3) = 2
    Static iLooper As Integer
       iLooper = 0
    Dim cdod As Long
       cdod = 3                  ' 項目数。
    Dim rgdod(3) As DIDEVICEOBJECTDATA
    Dim i as Integer

    ' lTimeStamp および lSequence は 0 に設定すること。
    For i = 0 To 3
        rgdod(i).lTimeStamp = 0
        rgdod(i).lSequence = 0
    Next i

    rgdod(0).lOfs = NumLockID
    rgdod(1).lOfs = CapsLockID
    rgdod(2).lOfs = ScrollLockID

    Select Case (rgiBits(iLooper) And 1) 
        Case Is = 0
            rgdod(0).lData = 0
        Case Is = 1
            rgdod(0).lData = &H80          ' NumLock ライトのオン/オフ
    End Select
        
    Select Case (rgiBits(iLooper) And 2) 
        Case Is = 0
            rgdod(1).lData = 0
        Case Is = 1
            rgdod(1).lData = &H80          ' CapsLock ライトのオン/オフ
    End Select
        
    Select Case (rgiBits(iLooper) And 4) 
        Case Is = 0
            rgdod(2).lData = 0
        Case Is = 1
            rgdod(2).lData = &H80          ' ScrollLock ライトのオン/オフ
    End Select
        
    iLooper = (iLooper + 1) Mod ARRAYSIZE  ' 0 から 3 までループする。

    Call diDevKeyboard.SendDeviceData(cdod, rgdod, 0)

End Sub