Platform SDK: DirectX |
ここでは、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 に含まれるデバイス管理のトピックを参照すること。