Platform SDK: DirectX

データ出力

[C++]

ヒューマン インターフェイス デバイスは、入力の生成と同様に出力を扱うことができる。IDirectInputDevice7::SendDeviceData メソッドは、データのパケットをそれらのデバイスに送る。

SendDeviceData は、反対に IDirectInputDevice7::GetDeviceData として表示することができる。SendDeviceData メソッドと同様、GetDeviceData メソッドは、データの基本単位として DIDEVICEOBJECTDATA 構造体を使用する。この場合、dwOfs メンバに含まれるのは、デバイスのデータ形式のオフセットではなく、データに関連付けられたデバイス オブジェクトのインスタンス ID である(オフセット識別子は、選択されたデータ形式での入力を提供するデバイス オブジェクトのためだけに存在するので、出力しか認めないオブジェクトは、オフセットを持つことすらない)。dwData メンバには、そのオブジェクトに適したデータが含まれる。dwTimeStamp および dwSequence メンバは使用しない。これらのメンバは、ゼロに設定しなければならない。

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

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

次の例では、コードが繰り返し実行される場合、キーボード上の LED (IDirectInputDevice7 インターフェース pdev により表される) は繰り返し点滅する。デバイス オブジェクト識別子、NumLockIDCapsLockID、および ScrollLockID は、デバイス オブジェクトの列挙中か、または IDirectInputDevice7::GetObjectInfo を呼び出すことで、DIDEVICEOBJECTINSTANCE 構造体の dwType メンバから事前に取得されている。LED の状態は、データ バイトの上位ビットにより決定されるものとする。

void FlashLEDs(void)
    {
static int     rgiBits[] = { 1, 2, 4, 2 };
static int     iLooper = 0;
DWORD       cdod = 3;         // 項目数。
DIDEVICEOBJECTDATA rgdod[3];
HRESULT      hres;
 
// dwTimeStamp および dwSequence を消去する必要がある。
ZeroMemory(rgdod, sizeof(rgdod));
 
rgdod[0].dwOfs = NumLockID;
rgdod[1].dwOfs = CapsLockID
rgdod[2].dwOfs = ScrollLockID;
 
rgdod[0].dwData = (rgiBits[iLooper] & 1) ?0x80 : 0; 
                                           // 1,0,0,0,...
rgdod[1].dwData = (rgiBits[iLooper] & 2) ?0x80 : 0; 
                                           // 0,1,0,1,...
rgdod[2].dwData = (rgiBits[iLooper] & 4) ?0x80 : 0; 
                                           // 0,0,1,0,...
 
iLooper = (iLooper + 1) % ARRAYSIZE(rgiBits); // 0 から 3 までループする。
 
hres = IDirectInputDevice7_SendDeviceData(pdev,
sizeof(DIDEVICEOBJECTDATA),
rgdod, &cdod, 0);
    }
[Visual Basic]

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

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

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

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