• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB2008: GetAsyncKeyState関数と&H7FFFの関係??)

VB2008: GetAsyncKeyState関数と&H7FFFの関係??

このQ&Aのポイント
  • VB2008で使用されるGetAsyncKeyState関数と&H7FFFの関係について、理解できません。
  • この判定ルーチンであるisGet = (GetAsyncKeyState(iKey) And &H8000)は、MSDNライブラリの判定方法に基づいています。
  • しかし、なぜこのプログラムが正常に動作するのか、根拠がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

リファレンスを確認しましたか? GetAsyncKeyStateは 前回の呼び出し以降に調べるキーが押されたかどうかと、現在押されているのかどうかを判定できる APIです 前回の呼び出し以降に押されたかどうかは 最下位ビット(Bit0) 現在押されているかどうかは 最上位ビット(Bit15) になっています 現在押されている場合 および 前回の呼び出し以降に押された場合 ともに 最下位ビットは1が立ちます よって お示しのプログラムで キー入力の有無を確認できると思います バッファに溜まっているキー入力も『入力あり』と判定されます 検査時に『押されているキーのみ』が対象なら isGet = (GetAsyncKeyState(iKey) And &H8000) で判定しましょう

noname#140971
質問者

お礼

やっと、判りました。 >GetAsyncKeyStateは 前回の呼び出し以降に調べるキーが押されたかどうかと、現在押されているのかどうかを判定できる APIです これが全てでした。 これで、不可思議な現象が不可思議ではなくなりました。 実に当たり前のことでした。 本当に感謝です。

noname#140971
質問者

補足

リファレンスは読んでいません。 しかし、GetAsyncKeyState の戻り値のビットは調べていました。 最上位ビットが立つのは確認できていました。 が、問題は・・・。 isGet = GetAsyncKeyState(iKey) And &H7FFF If isGet Then   Debug.Print(Bit16(GetAsyncKeyState(iKey)))   Exit For End If で、表示されたのは "1000000000000000 -> ●○○○○○○○○○○○○○○○" これは、&h8000 なら判定可。しかし、&h7fff では不可。 ? Bit16(&h8000 AND &h7fff) "0000000000000000 -> ○○○○○○○○○○○○○○○○" ? Bit16(&h8000 AND &H8000) "1000000000000000 -> ●○○○○○○○○○○○○○○○" ここが判らない訳です。 実は、ビット演算子の演習をしていたところ。 「&h8000 AND &H8000で判定可能」と言うのを証明しようと試みていました。 が、&h7fff では不可なのに判定しているので大混乱。 問題のポイントは、一度判定すると &H8000 になるのか? 問題のポイントは、私のBit16でのデバッグの試みそのものに誤りがあるのか? この答えが知りたいと思っています。 Function Bit16(ByVal iC As Integer) As String Dim I As Integer Dim aBit As String = "" For I = 15 To 0 Step -1 aBit = aBit & ((iC >> I) And &H1).ToString Next I Return aBit & " -> " & Strings.Replace(Strings.Replace(aBit, "0", "○"), "1", "●") End Function

関連するQ&A