• ベストアンサー
※ 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

  • VB2005で、Structureの配列を返すプログラムを以下のように書きたい

    VB2005で、Structureの配列を返すプログラムを以下のように書きたいのですが、そもそもVB6しか使ったことが無いもので、以下のような素数の結果を返すこのプログラムの書き方はVB2005らしいでしょうか? Module Module1 Public Structure SosuuStatus Public num As Integer Public status As String End Structure Class Sosuu Function SosuuCheck(ByVal st As Integer, ByVal ed As Integer) As SosuuStatus() Dim i As Integer, j As Integer Dim sosuu(0 To ed - st) As SosuuStatus Dim cnt As Integer = 0 For i = st To ed sosuu(cnt).num = i sosuu(cnt).status = "" '初期化 If 1 = i Then sosuu(cnt).status = "素数ではない" ElseIf 0 = (i Mod 2) Then sosuu(cnt).status = "素数ではない" Else For j = 3 To Math.Sqrt(ed) If 0 = (i / j) Then sosuu(cnt).status = "素数ではない" End If Next j End If If sosuu(cnt).status = "" Then sosuu(cnt).status = "素数である" End If cnt = cnt + 1 Next i SosuuCheck = sosuu End Function End Class End Module

  • vb コンボボックスのイベントについて

    こんばんわ。 コンボボックスで、 指定の値をマウス操作でクリックしたときと、 キーボードの上下で、移動後returnを押したときだけ、 MsgBox "処理実行" を実行したいです。 keystateを使ってみたのですが、前の情報が残っているのかうまくいきません。keystateの情報をクリアさせるか、シンプルに上記を動作させる何かよい方法はありますでしょうか。 Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Dim flg1 As Boolean Private Sub form_load() Combo1.AddItem (11) Combo1.AddItem (22) Combo1.AddItem (33) Combo1.AddItem (44) End Sub Private Sub Combo1_Keyup(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then 'return flg1 = True Call Combo1_click End If End Sub Private Sub Combo1_click() If (GetKeyState(&H26) <> 0) Or (GetKeyState(&H28) <> 0) Then ' ↑↓ If flg1 = False Then Exit Sub End If End If MsgBox "処理実行" flg1 = False End Sub

  • VBのReturnの使い方

    Excel2007のVBで以下のfunctionを定義すると、Returnのところでコンパイルエラーになります。 -------------------------------------- Public Function IsTen(lNumber As Integer) As Boolean If lNumber = 10 Then Return True Else Return False End If End Function -------------------------------------- ググってみるとReturn True とか Return False とかができるように思えるのですが、何が不味いのでしょうか? VBの知識はあまりなく、低レベルな質問かもしれませんが、よろしくお願いします。

  • GetCursorInfoの使い方

    GetCursorInfoの使い方について教えてください。現在は下記のようにしていますが返り値に0しかはいりません。なにがおかしいかご指導お願いします。m(._.)m ペコッ --モジュール-- Public Declare Function GetCursorInfo Lib "user32" (pci As CURSORINFO) As Long Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer Public Type POINTAPI X As Long Y As Long End Type Public Type CURSORINFO cbSize As Long flags As Long hCursor As Long ptScreenPos As POINTAPI End Type Public Field As CURSORINFO --Form1-- Dim lRet As Long Private Sub Timer1_Timer() If GetAsyncKeyState(vbKeyHome) Then lRet = GetCursorInfo(Field) End If End Sub

  • VB2008: ファイルから1行づつ読み込む関数のバグの修正方法?

    ' ========================================== ' 全ての行を読み込んで "" 行以外を出力する ' ========================================== Module theGrap   Sub Main()     Dim iNow As Integer = 0     Dim iNext As Integer = 0     Dim aLine As String = ""     Do       iNow = iNext       aLine = FGets("D:\Temp\Test4.txt", iNow, iNext)       If aLine = "" Then Continue Do       Debug.Print(aLine)     Loop Until iNext = -1   End Sub End Module [イミディエイト ウインドウ] 123あいうえお90 123かきくけこ90 123さしすせそ90 と、成功しています。 ' -------------- ' 行末まで読む ' -------------- Do   fs.Seek(iNowPosition, SeekOrigin.Begin)   fs.Read(aBuf, 0, 2)   aChar = ec.GetString(aBuf).Substring(0, 1)   If aChar <> Chr(13) Then     aChars &= aChar   Else     iNowPosition = iNowPosition - 1     Exit Do   End If   iNowPosition += txt.LenB(aChar) Loop While iNowPosition < fs.Length And (aChar <> Chr(13) Or aChar <> Chr(10)) しかし、実は、FGets 関数では1文字づつ読み込んでいます。 そこで、StreamReader で一行を読み込むように修正。 [イミディエイト ウインドウ] 123?????90 123?????90 123?????90 すると見事に化けてしまいました。 化けること自体は理解できるのですが、化けを修正する術がわかりません。 Function FGetl(ByVal aFile As String, _         ByVal iNowPosition As Integer, _         ByRef iNextPosition As Integer) As String   Dim aBuf(1) As Byte   Dim aChars As String = ""   iNextPosition = -1   If File.Exists(aFile) Then     Try       Using fs As FileStream = New FileStream(aFile, FileMode.Open, FileAccess.Read)         Dim sr As StreamReader         Dim ec As Encoding = Encoding.Default         fs.Seek(iNowPosition, SeekOrigin.Begin)         sr = New StreamReader(fs)         aChars = sr.ReadLine         iNowPosition += txt.LenB(aChars)         iNextPosition = NextPosition(fs, iNowPosition)         fs.Close()         Return aChars       End Using     Catch ex As IOException       MsgBox(ex.Message & "(FGets)", MsgBoxStyle.Exclamation, "エラー:")       Return ""     End Try   Else     Return ""   End If End Function 文字の化けを修正する方法を教えて頂ければ幸いです。

  • 押されているキーの評価について

    Excel2002のVBAです。 次のコードで押されたキーを判別していますが、Altの時だけ、 キーを離なしても、離したあと1度だけ、押されていると評価 されてしまいます。 これは回避できないのでしょうか? '--------------------------- Declare Function GetAsyncKeyState Lib "user32.dll" _ (ByVal vKey As Long) As Long '--------------------------- Private Sub CommandButton1_Click() If GetAsyncKeyState(vbKeyControl) <> 0 Then MsgBox "CTRLキーを押しながらクリックされました。" End If If GetAsyncKeyState(vbKeyShift) <> 0 Then MsgBox "Shiftキーを押しながらクリックされました。" End If If GetAsyncKeyState(vbKeyMenu) <> 0 Then MsgBox "Altキーを押しながらクリックされました。" End If End Sub

  • Excel2010 VBA 条件色付け

    Sub sample() Dim r As Range For Each r In Range("q6:q30") If myIsNumeric(r) Then r.Offset(0, 1).Value = "数字" Else r.Offset(0, 1).Value = "文字" End If Next End Sub Function myIsNumeric(Target As Range) Dim r As Range Dim buf, tmp Dim flg As Boolean Dim i As Integer buf = Target For i = 1 To Len(buf) tmp = Mid(buf, i, 1) If IsNumeric(tmp) Then flg = True Exit For End If Next myIsNumeric = flg End Function を数字が入ってたら塗りつぶさないで、 数字が入ってなかったら塗りつぶすように直したいです。 あああ→塗る あああ1-1→塗らない 住所→塗る 住所12→塗らない

  • VBAでGetAsynckeyStatekのエラー

    初めて質問します。なので、情報が少なかったらすみません。 windows7 64bit Excel2010でVBAにトライしています。 その中で「GetAsynckeyState」関数を使用して、キーボードの入力を判定したく、 コードを書いたところ「GetAsynckeyStateはUser32.dll 内に見つかりません」という エラーが発生しました。 下記がそのコードです。使用できるようにしたいのですがどうしたらいいでしょうか。ご教授お願いします =================== Option Explicit Private Declare Function GetAsynckeyState Lib "user32.dll" (ByVal vKey As Long) As Long Sub test() If GetAsynckeyState(38) <> 0 Then Range("B1") = "●" Else Range("B1") = "" End If End Sub ====================

  • vb6.0のプログラム

    今こんなプログラムを作っているのですがなぜか、足りない部分があると言われて困っております。 できれば教えてください。 図 ーーーーーーーーーーーーーーーー from ーーーーーーーーーーーーーーーー 残り30秒[ーーーーラベルーーーー] 000+000=000←(3つともlabel) □-------------------□←HScrollbar max100 min0 [コマンドボタン] [タイマー]←非表示 ーーーーーーーーーーーーーーーー コード Private intCount As Integer Private intSecond As Integer Private Sub cmdStart_Click() Dim intNum1 As Integer Dim intNum2 As Integer If cmdStart.Caption = "Start" Then intCount = 0 intSecond = 30 lblResult.Caption = "" cmdStart.Caption = "OK" tmrSecond.Enabled = True ElseIf cmdStart.Caption = "OK" Then If CInt(lblAnswer.Caption) = CInt(lblNum1.Caption) + CInt(lblNum2.Caption) Then lblResult.Caption = lblResult.Caption & "○" intCount = intCount + 1 Else lblResult.Caption = lblResult.Caption & "×" End If intNum1 = Rnd() * 50 intNum2 = Rnd() * 50 lblNum1.Caption = intNum1 lblNum2.Caption = intNum2 End If End Sub Private Sub hsbAnswer_Change() lblAnswer.Caption = hsbAnswer.Value End Sub Private Sub tmrSecond_Timer() intSecond = intSecond - 1 lblTime.Caption = "残り" & intSecond & "秒" If intSecond = 0 Then tmrSecond.Enabled = False MsgBox (intCount & "問正解") cmdStart.Caption = "Start" Else End If End Sub どうぞよろしくお願いします。

  • vb.netでByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

このQ&Aのポイント
  • 職場で好きな男性にラインIDを渡したが、返事がなく悩んでいる。
  • 相手とはあまり話したことがなく、好きになった理由や状況を詳しく説明。
  • 視線を感じることがあり、以前ほど目が合わなくなった。返事がない今、何をすべきか悩んでいる。
回答を見る