Platform SDK: DirectX

デバイス変更の認識

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。

[C++]

USB (Universal Serial Bus) デバイスは、システムを再起動しなくても装着や取り外しができるので、入力デバイスの構成の変化にアプリケーションが反応できるようにしなければならない。たとえば、コントローラをもう 1 台挿すことで、進行中のゲームに新たなプレーヤーが参加できるようにすることを考えてみる。

デバイスが変化するときにメッセージを受け取るには、まず、以下のサンプル コードのように、通知を受け取るように登録する必要がある。

PVOID hNotifyDevNode;
 
void RegisterForDevChange(HWND hDlg, PVOID *hNotifyDevNode)
{
DEV_BROADCAST_DEVICEINTERFACE *pFilterData = 
(DEV_BROADCAST_DEVICEINTERFACE*) 
_alloca(sizeof(DEV_BROADCAST_DEVICEINTERFACE));
ASSERT (pFilterData);
 
ZeroMemory(pFilterData, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
 
pFilterData->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
pFilterData->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
pFilterData->dbcc_classguid  = GUID_CLASS_INPUT; 
 
*hNotifyDevNode = RegisterDeviceNotification(hDlg, pFilterData,
            DEVICE_NOTIFY_WINDOW_HANDLE);
}

次に、以下の例のように、メイン ウィンドウ プロシージャで、デバイスがアタッチされたこと、デバイスがこれから取り外されること、デバイスが既に取り外されたことを通知するメッセージをチェックする。

MyWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
switch (nMsg)
    {
case WM_DEVICECHANGE:
        {
switch (wParam)
            {
case DBT_DEVICEARRIVAL:
// デバイスの到着を処理する
break;

case DBT_DEVICEQUERYREMOVE:
// デバイスの削除要求を処理する
break;
                
case DBT_DEVICEREMOVECOMPLETE:
// デバイスの削除を処理する
break;
            }
        }
.
.
.
    }
}

DBT_DEVICEARRIVAL イベントに応じて、IDirectInput7::FindDevice を使ってデバイスのインスタンス GUID を取得し、この値を IDirectInput7::CreateDeviceEx に渡す。

詳細については、Platform SDK に含まれるデバイス管理のトピックを参照すること。