<環境>
Ruby 1.9.3
Windows8
お世話になっています。
Rubyでキーボードの状態の取得を行いたいと思っています。
ほぼキー全体の状態を得たいのでgetkeyboardstateを使用したいと思い
以下のプログラムを作成しました。
Ruby
1 @getkeyboardstate = Win32API.new('user32', 'GetKeyboardState', 'i', 'i') 2 @getkey = [] 3 @getkey.fill(0, 0..255) #256バイト分0で埋める 4 p @getkeyboardstate.call(@getkey[0]) # =>0 5 p @getkey # =>[0,0,0,0,0,0,0..
エラー自体は出ないのですが、4行目の
@getkeyboardstate.call(@getkey[0]) の返り値が0で(正常な場合は0以外の値が返るとの記述を見た)
且つ@getkeyも値の変化が全くない為、
恐らく正常に取得できていないのではないかと考えています。
<試してみた事>
①Win32API の送り値の数を変更。
⇒ArgumentError 1 of 4 のエラーがが出たので、4つで合っていると思われる。
②GetKey**boardState を GetKeyB**oardState にする
⇒そんなものはない、とエラーを返される
③@getkeyboardstate.call(@getkey[0])を@getkeyboardstate.call(@getkey)に
⇒タイプエラー(can't convert Array into String)
④Win32API.new('user32', 'GetKeyboardState', 'i', 'i')の『'』を『"』にする
⇒特に変化なし
そもそもdllの呼び出し方の書き方がおかしいのかと思い、別途GetKeyStateでも試してみました。
Ruby
1 @getkeystate = Win32API.new("user32", "GetKeyState", "i", "i") 2 while true 3 p @getkeystate.call(90) # =>0 か 1 か -127 か -128 4 end
これは(恐らくですが)正常に取得できました。
『z』キー(キーコード:90)を押したり離したりすると、値が変わります。
.
ここからどう手を付ければいいのかわからず、質問に至りました。
Rubyの GetKeyboardState でのキーボードの状態の取得方法、または
別途いい案がありましたら教えて頂けると嬉しいです。
尚、GetKeyStateをループしてゴリ押し、も出来るとは思いますが、なるべく処理を早くしたいため、
GetKeyboardStateのような一括で結果を返す送り値で行えればと思います。
以上、よろしくお願いいたします。
追記:2019/01/24 11:28
VB6で上記と同様と思われるプログラムを作成しました。
こちらは正常に動作します。(返り値に1が返る)
VB6
1Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long 2 3Private Sub Form_Activate() 4 Dim state(255) As Byte 5 Label1.Caption = GetKeyboardState(state(0)) 'GetKeyboardStateの返り値(1 固定) 6 Label2.Caption = state(90) 'zキーを押した結果(0=>129=>1=>128=>0...) 7End Sub
回答2件
あなたの回答
tips
プレビュー