プロが教えるわが家の防犯対策術!

VB5.0(SP3)で次のプログラムを作成しました。

キーボードからNumLockキーを押して状態をOFFにすると、プログラム側(タイマー関数内)でその状態をチェックし、状態をONに戻します。

しかし、次の動作をした時に問題が発生しました。
但し、この問題は、OSがWindowsNT4.0(SP6)の端末で発生するのですが、Windows2000/XP では発生しませんでした。

起動したフォーム画面にフォーカスがある間は問題ないのですが、フォーカスを外した状態でNumLockキーを押して状態をOFFにすると、ON/OFFが繰り返されてしまいます。
この時に、マウスをフォーム画面の上に持ってくるとその繰返し処理が止まります。
もちろん再度 NumLockキーを押しても止まります。


OSの問題なのでしょうか?それともプログラムが悪いのでしょうか?
下記にそのプログラムを表記します。


<プログラム>
フォーム(Form1)にタイマー(Timer1)を貼りつけただけです。


(Module1.bas)
Option Explicit

Public Const VK_NUMLOCK = &H90
Public Const KEYEVENTF_KEYUP = &H2

Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _
                       ByVal bScan As Byte, _
                       ByVal dwFlags As Long, _
                       ByVal dwExtraInfo As Long)


(Form1.frm)
Option Explicit

Private Sub Form_Load()
  Timer1.Interval = 100
End Sub


Private Sub Timer1_Timer()

  On Error Resume Next

  If GetKeyState(VK_NUMLOCK) = 0 Then
    keybd_event VK_NUMLOCK, 0, 0, 0
    keybd_event VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0
  End If

End Sub

A 回答 (2件)

AttachThreadInputで、フォーカスを持っている


スレッドにアタッチしてからGetKeyStateで、
調べてみてはどうでしょうか?

いま、手元にNT4.0の環境がないので確認できないのですが・・・

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0

キーボードを押す関数VB定義のSendKeysとかそういったAPIを使用すると、どうもNUM Lockに変なことが起こるようです。


私もNUM Lockを押すプログラムではないのですが、他のキーを押すプログラムを昔WIN98上で作っていたとき、そんなことがありました。

100ミリ秒というのはかなり重いと思うのですが、もっと間隔をあけることはできませんか?
キーか押されるまえにタイマーのイベントが複数同時に起こって、NUM Lockがオンになっているという状態になるまで、時間がかかるのではないかと思います。
    • good
    • 0
この回答へのお礼

早速のお返事ありがとうございます。
1000ミリ秒や5000ミリ秒で設定してもダメでした。
設定した間隔でON/OFFが繰り返されました。

お礼日時:2002/05/24 18:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!