キーを押している間の時間を計測するには?


ku  2009-06-09 21:41:26  No: 101815  IP: 192.*.*.*

こんばんは。お尋ねしたいことがあります。

「キーを押している間の時間」を計測するのはどうすればよいでしょうか?

最終的に作りたいプログラムは、
①「初めの24秒間にキーを押している時間(A)を計測する」
②「25秒目以降の連続した24秒の間にキーを押している時間(B)を計測する」
③「BがAの半分以下になった時に、画面に○(何でも良い)を表示する」
です。
実験において、被験者が刺激を見ている時間を計測し、だんだん見なくなったとき(③が基準)に次の実験フェーズへ移るのですが、そのためにこのプログラムが必要なのです・・・
VBでできるということなのですが、まず最初でてこずっています。

恐縮ですが、宜しくお願いします。

編集 削除
ゆう  2009-06-10 00:51:36  No: 101816  IP: 192.*.*.*

たとえばFormオブジェクトには

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
・・・・
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
・・・・
End Sub

のようにKeyDownとKeyUpのイベントが用意されていますので
この時間間隔を累積すればできそうです。

フォーカスがFormでなく別のオブジェクトにあるならそちらの
イベントプロシージャで処理すればいいでしょう。

編集 削除
魔界の仮面弁士  2009-06-10 09:36:48  No: 101817  IP: 192.*.*.*

KeyDown / KeyUp でも良いですが、オートリピート中かどうかの判定が必要になりそうですね。

以下、オートリピート中かどうかを判断する方法について。

(案1) WM_KEYDOWN メッセージを拾って、lParam を見て判断する。
(案2) KeyUp が発生する前に次の KeyDown が来たら、オートリピートと判断する。
(案3) DirectInput のバッファリングモードで、DXCallback イベント中に DIKEYBOARDSTATE を見て判断する。


ついでに現在時刻の取得方法も書いておきます。精度は高くありませんが。

Public Function GetTime() As String
  Dim f As Single
  f = Timer()
  GetTime = Format(Now(), "yyyy-MM-dd hh:mm:ss") & Format(f - Int(f), ".0000")
End Function

編集 削除
ku  2009-06-11 14:33:13  No: 101818  IP: 192.*.*.*

ゆうさま、魔界の仮面弁士さま、早速のご返信ありがとうございます。

実はtimerを応用的に使ったことがほとんどなく…(初心者板に書き込むべきだったと反省しております。。)
KeyDown,KeyUpとストップウォッチの作成の仕方を組み合わせてやってみればよいのでしょうか。
オートリピート中かどうかの判断がなぜ必要になってくるのかが、知識不足でわかりません…ご説明いただけるとありがたいです。


以下、目的を詳しく書かせていただきます。
刺激の1試行が8秒間からなっています。
①最初の3試行(24秒間)のキー押しの累積時間(A)を測定
②4〜6試行目のキー押しの累積時間(B)を測定
③BがAの半分以下になっていれば、画面に○を提示
                  なっていなければ、次の5〜7試行目の累積時間を(B’)を測定…以下繰り返し

を作成しようと思っています。

編集 削除
yu  2010-06-18 15:12:44  No: 101819  IP: 192.*.*.*

>オートリピート中かどうかの判断がなぜ必要になってくるのかが、知識不足でわかりません…ご説明いただけるとありがたいです。

分かりやすく言うなら、現実世界でキーを押したままにしていても、
PC側で高速連打して(高速でKeyDownを繰り返して)いる事になっています。
なので、時間間隔を求める場合、KeyDownで基準となる時間を求める事になると思いますが、その時間を何度も更新する事になってしまいます。

編集 削除