こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

既に半日以上の調査とテストを繰り返しました。
問題は、どういう理由で以下のプログラムが正常に動作するのか?
その根拠が判りません。

isGet = (GetAsyncKeyState(iKey) And &H8000)

という判定ルーチンであれば MSDN ライブラリの判定方法だから判ります。
たまさかということではなく、最初の1回だけに通用する方法なようです。
ですから、ますます、判りません。

誰か、スッキリとしか回答をお願いします。

Module theInkey
  Sub Main()
    Dim StopNow As Boolean
    Dim Answer As MsgBoxResult
    Dim iKey As Integer
    Dim aKey As String

    Do
      aKey = ""
      If Inkey(iKey) Then
        If iKey > 32 And iKey < 127 Then
          aKey = Strings.Chr(iKey)"
        Else
          aKey = "OTHERS"
        End If
        If aKey.Length >0 Then
          Message(aKey)
          Answer = Verify("終了しますか?(Year/New)")
          StopNow = (Answer = MsgBoxResult.Yes)
        End If
      End If
    Loop Until StopNow
  End Sub
End Module

Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal iKey As Integer) As Short

Function Inkey(ByRef iKey As Integer) As Boolean
  Dim isGet As Boolean

  For iKey = 8 To 128
    isGet = (GetAsyncKeyState(iKey) And &H7FFF)
    If isGet Then
      Exit For
    End If
    System.Windows.Forms.Application.DoEvents()
  Next iKey
  Return isGet
End Function

投稿日時 - 2009-02-20 15:32:39

QNo.4733980

困ってます

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

リファレンスを確認しましたか?

GetAsyncKeyStateは 前回の呼び出し以降に調べるキーが押されたかどうかと、現在押されているのかどうかを判定できる APIです

前回の呼び出し以降に押されたかどうかは 最下位ビット(Bit0)
現在押されているかどうかは 最上位ビット(Bit15)
になっています

現在押されている場合 および 前回の呼び出し以降に押された場合
ともに 最下位ビットは1が立ちます

よって お示しのプログラムで キー入力の有無を確認できると思います
バッファに溜まっているキー入力も『入力あり』と判定されます

検査時に『押されているキーのみ』が対象なら
isGet = (GetAsyncKeyState(iKey) And &H8000)
で判定しましょう

投稿日時 - 2009-02-20 18:00:10

補足

リファレンスは読んでいません。

しかし、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

投稿日時 - 2009-02-20 19:22:05

お礼

やっと、判りました。

>GetAsyncKeyStateは 前回の呼び出し以降に調べるキーが押されたかどうかと、現在押されているのかどうかを判定できる APIです

これが全てでした。
これで、不可思議な現象が不可思議ではなくなりました。
実に当たり前のことでした。

本当に感謝です。

投稿日時 - 2009-02-20 19:49:13

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問