C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: GetKeyboardStateについて


(過去ログ 74 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■43346 / inTopicNo.1)  GetKeyboardStateについて
  
□投稿者/ たぬき (35回)-(2009/11/06(Fri) 12:04:32)

分類:[.NET 全般] 

久しぶりに質問させてもらいます!

今、キーボードの入力を検出するアプリケーションを作成しています。キー入力の検出には、GetKeyboardStateを使用したいと思います。
そこで、Timerイベントを使用して、毎回キーの状態変化を取得したいのですが、関数を正しく使えないのかエラーがでてしまいます。
どこがおかしいかご指摘いただきたいです!

    Dim key(0 To 255) As Byte
Dim i As Integer
Call GetKeyboardState(key(0))
For i = 0 To 255
If (key(i) And &H8001) Then
Debug.Print("押す" & key(i))
else
Debug.Print("離す" & key(i))
End If
Next
引用返信 編集キー/
■43350 / inTopicNo.2)  Re[1]: GetKeyboardStateについて
□投稿者/ GOD (12回)-(2009/11/06(Fri) 13:40:55)
No43346 (たぬき さん) に返信
> 久しぶりに質問させてもらいます!
>
> 今、キーボードの入力を検出するアプリケーションを作成しています。キー入力の検出には、GetKeyboardStateを使用したいと思います。
> そこで、Timerイベントを使用して、毎回キーの状態変化を取得したいのですが、関数を正しく使えないのかエラーがでてしまいます。
> どこがおかしいかご指摘いただきたいです!
>
どんなエラーが出ますか?
GetKeyboardState の戻り値を参照していないからエラー情報を取っていないと思うのですが。

あと、Byte型の範囲を確認してください。
http://msdn.microsoft.com/ja-jp/library/47zceaw7.aspx
引用返信 編集キー/
■43351 / inTopicNo.3)  Re[1]: GetKeyboardStateについて
□投稿者/ 魔界の仮面弁士 (1376回)-(2009/11/06(Fri) 14:30:11)
2009/11/06(Fri) 14:33:50 編集(投稿者)
No43346 (たぬき さん) に返信
> どこがおかしいかご指摘いただきたいです!
記述が VB.NET のコードというよりも、VB6 のそれに近い物になっていますね。
また、GetKeyboardState と GetAsyncKeyState を混同しているようにも見えます。


> Dim i As Integer
> For i = 0 To 255
間違いではありませんが、「For i As Integer = 0 To 255」の方が良いかと。

>     If (key(i) And &H8001) Then
何のために、&H8001 を And しているのでしょうか?

GetKeyboardState の結果を調べるなら、最上位ビット(キー押下の有無)、
あるいは最下位ビット(トグル状態)の値を見ることになるので、たとえば
 If CBool(key(i) And &H80) Then
 If (key(i) And &H80) <> 0 Then
 If (key(i) And &H80) = &H80 Then
などになるかと思います。

引用返信 編集キー/
■43356 / inTopicNo.4)  Re[2]: GetKeyboardStateについて
□投稿者/ たぬき (36回)-(2009/11/06(Fri) 15:11:43)
■GODさんに返信

すみません。エラーではないです。戻り値がうまくかえってこなくて・・・全て0が返ってきます!

>あと、Byte型の範囲を確認してください。

一個オーバーしちゃってますね!256個必要な時は、byte型は使用できないということですか???
引用返信 編集キー/
■43357 / inTopicNo.5)  Re[2]: GetKeyboardStateについて
□投稿者/ たぬき (37回)-(2009/11/06(Fri) 15:15:09)
No43351 (魔界の仮面弁士 さん) に返信

すみません。確かに混同していました!前に作成したアプリケーションを参考にしたのですが、この関数とは戻り値が少し違うんですね!

> 間違いではありませんが、「For i As Integer = 0 To 255」の方が良いかと。
> GetKeyboardState の結果を調べるなら、最上位ビット(キー押下の有無)、
> あるいは最下位ビット(トグル状態)の値を見ることになるので、たとえば
>  If CBool(key(i) And &H80) Then
>  If (key(i) And &H80) <> 0 Then
>  If (key(i) And &H80) = &H80 Then
ご指摘ありがとうございます。治したいと思います。
CBoolの使い方もできるんですね!勉強になります。
引用返信 編集キー/
■43361 / inTopicNo.6)  Re[3]: GetKeyboardStateについて
□投稿者/ GOD (13回)-(2009/11/06(Fri) 16:10:47)
2009/11/06(Fri) 16:12:25 編集(投稿者)
2009/11/06(Fri) 16:12:06 編集(投稿者)

<pre><pre>■No43356 (たぬき さん) に返信
> ■GODさんに返信
> 
> すみません。エラーではないです。戻り値がうまくかえってこなくて・・・全て0が返ってきます!
> 
> >あと、Byte型の範囲を確認してください。
> 
> 一個オーバーしちゃってますね!256個必要な時は、byte型は使用できないということですか???
>
配列の取り方には問題ないです。
リンク先を見ていただければわかると思いますが、byte型は0〜255(0〜FF)の範囲しか表せません。
&H8001 と比較してもあまり意味を成しませんよ。(魔界の仮面弁士 さんが書いてくれていますね。)
例えば
    8001         8001
AND   01     AND   80  (<--- 引数で取得できる値)
---------   ---------
      01           00  (<--- AND後の結果)
となります。

使用できる型と、型の範囲は基礎部分なので一度目を通しておくことをお勧めします。

※崩れていたので図表モードに変更。</pre></pre>

引用返信 編集キー/
■43366 / inTopicNo.7)  Re[3]: GetKeyboardStateについて
□投稿者/ GOD (14回)-(2009/11/06(Fri) 17:49:23)
No43356 (たぬき さん) に返信
> ■GODさんに返信
>
> すみません。エラーではないです。戻り値がうまくかえってこなくて・・・全て0が返ってきます!
>
↓を参考にどうぞ。
http://www.microsoft.com/japan/msdn/archive/community/gdn/ShowPost-16684.htm
引用返信 編集キー/
■43412 / inTopicNo.8)  Re[4]: GetKeyboardStateについて
□投稿者/ たぬき (38回)-(2009/11/10(Tue) 11:24:19)
No43361 (GOD さん) に返信

丁寧な回答ありがとうございます!
解決することができました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -