- ベストアンサー
VB2008: GetAsyncKeyState関数と&H7FFFの関係??
- VB2008で使用されるGetAsyncKeyState関数と&H7FFFの関係について、理解できません。
- この判定ルーチンであるisGet = (GetAsyncKeyState(iKey) And &H8000)は、MSDNライブラリの判定方法に基づいています。
- しかし、なぜこのプログラムが正常に動作するのか、根拠がわかりません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連する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
- 締切済み
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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の知識はあまりなく、低レベルな質問かもしれませんが、よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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 文字の化けを修正する方法を教えて頂ければ幸いです。
- ベストアンサー
- Visual Basic
- 押されているキーの評価について
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→塗らない
- ベストアンサー
- Excel(エクセル)
- 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 どうぞよろしくお願いします。
- ベストアンサー
- Visual Basic
- 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++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。
- ベストアンサー
- SE・インフラ・Webエンジニア
- 職場で好きな男性にラインIDを渡したが、返事がなく悩んでいる。
- 相手とはあまり話したことがなく、好きになった理由や状況を詳しく説明。
- 視線を感じることがあり、以前ほど目が合わなくなった。返事がない今、何をすべきか悩んでいる。
お礼
やっと、判りました。 >GetAsyncKeyStateは 前回の呼び出し以降に調べるキーが押されたかどうかと、現在押されているのかどうかを判定できる APIです これが全てでした。 これで、不可思議な現象が不可思議ではなくなりました。 実に当たり前のことでした。 本当に感謝です。
補足
リファレンスは読んでいません。 しかし、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