2012-03-29 33 views
4

キーボードが接続されているか切断されているかを判断しようとしています。私は、以下の戦略を試してみました:how to determine keyboard disconnected in DirectInputで示唆されたMSDNに説明したようにRegisterDeviceNotifactionを使用してキーボードが接続/切断されたときのWin32の判断

RegisterDeviceNotification

。私はこれを試したときに、他の情報を提供しないウィンドウコールバックでDB_DEVNODES_CHANGEDイベントを取得します(未知数デバイスの接続状態が変更されました)。私は登録のために様々なGUIDを試しました:4D36E96B-E325-11CE-BFC1-08002BE10318(いくつかのウェブサイトはこれがキーボードのクラスguidだと言います)とguidInstanceはIDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY)から取得しました。しかし、私はまだDB_DEVNODES_CHANGEDイベントしか手に入れません。

IDirectInput8 :: EnumDevices

IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY)を呼び出すたびにのみ接続されているデバイスを列挙すべきです。ただし、キーボードを切断すると、それでもEnumDevicesで列挙されます。ゲームコントローラ(タイプDI8DEVCLASS_GAMECTRL)で同じことをすると、コントローラは接続時にのみ列挙され、接続状態を判断できます。

その他の機能

は、私が試してみました:

  1. IDirectInput8::GetDeviceStatus
  2. IDirectInputDevice8::GetCapabilities
  3. IDirectInputDevice8::GetDeviceInfo
  4. IDirectInputDevice8::GetDeviceState
  5. IDirectInputDevice8::Poll

すべての機能が成功し、キーボードが接続されているかどうかについてはわかりません。

私はMSDNのkeyboard sectionも見ていますが、無駄です。

質問

  1. これを行ったことのある人が成功し、私は右のアプローチを取っている確認することができますか?
  2. 私は見落としている別の関数またはAPIがありますか?
  3. 例を挙げたウェブサイト(私はうまくいきませんでした)?
  4. EnumDevicesがコントローラで正しく動作し、キーボードで正しく動作しないのはなぜですか?そして、私はそれを私のキーボードのために働かせますか?
+1

あなたの書式に**少ない** NOISEを使用してください。それはあなたの質問を大胆に混乱させるすべての巨大なフォントで読むのが難しくなります。私は理解できるように物事を静かにした(実際にリスト項目を数えて意味をなさせる)。簡単にあなたの質問を読むことです、より良いあなたのチャンスは、答えを得ることです(と通常、より迅速に、同様に)。 :) –

答えて

3

あなたはpDataをためRID_DEVICE_INFOを使用して、それがdwTypeだチェック、GetRawInputDeviceList()GetRawInputDeviceInfo()を検討していますか?

これはあなたのwndProcがWM_INPUT_DEVICE_CHANGEを処理する場合、追加/削除を検出するためにparamsを使用することができ、lParamはGetRawInputDeviceInfo()に送られます。

コメント:WM_INPUT_DEVICE_CHANGEは、RegisterRawInputDevices()と呼ばれ、この通知を求められたアプリにのみ届きます。

+0

これは良いです。私は、キーボードのデバイスリストにプラグインされている2つのキーボードデバイスが含まれています。キーボードを取り外すと、キーボードは1に下がります。だから私は 'GetRawInputDeviceInfo'からより多くの情報を得ることができるかどうかを追跡しています。イベントループに 'WM_INPUT_DEVICE_CHANGE'イベントがありません。そのイベントを受け取るために何か特別なことがありますか?私はコンソールアプリケーションとウィンドウレスのイベントループを実行しています。 – RunHolt

+0

WM_INPUT_DEVICE_CHANGEが暗示する "オンリーデスクトップアプリ" と言うためにこのページ([リンク](http://msdn.microsoft.com/en-us/library/windows/desktop/ms645591(V = VS.85).aspxの))コンソールアプリケーションには送信されません。 – uesp

+1

@uesp:それはそれは望んでいる場合は、通常のアプリノート対メトロ、コンソールアプリは通常のウィンドウを持つことができます。 – Anders

関連する問題