Option Explicit
Dim MyMode As String
Const KEY_CNT = &H10 'スキャンイベント個数
Const MOVE_INTERVAL = 20 'マウス取得最小時間
Dim KeyList(KEY_CNT) As String 'キー名称一覧
Dim KeyState(KEY_CNT, 2) As Long 'キー状態 0:前回 1:今回 2:変化
Private Sub Command1_Click()
Dim tMsg As Msg 'メッセージパラメータ
'表示文字
Dim EventName As String 'イベント名
Dim EventTime As String '前回のイベント発生からの時間
Dim MousePos As String 'マウス座標
Dim UpDown As String 'Up Down
Dim KeyCode As String 'キーコード16進
Dim KeyStr As String 'キー文字
Dim Time_Old As Long '前回のイベント発生時刻
Dim Pt_Old As POINTAPI '前回のマウス位置
Dim Rc As Long
MyMode = "Go"
Command1.Enabled = False
Command2.Enabled = True
List1.Clear
Call EventsAnlyz(tMsg, True) '初期状態読み込み
Time_Old = GetTickCount() '時間記憶
Pt_Old.X = tMsg.pt.X 'マウス位置記憶
Pt_Old.Y = tMsg.pt.Y
Do
'------------------------------------------------
Rc = EventsAnlyz(tMsg) 'イベントスキャン
'------------------------------------------------
UpDown = ""
KeyCode = ""
KeyStr = ""
If Rc = 0 Then 'クリック無し≒マウス移動
'最小取得時間以上かつ移動が有った場合のみ取得
If (tMsg.time - Time_Old) >= MOVE_INTERVAL And _
Pt_Old.X <> tMsg.pt.X And Pt_Old.Y <> tMsg.pt.Y Then
EventName = "Move"
Else
EventName = ""
End If
Else 'クリック Down or Up
EventName = "Click"
KeyCode = Format(Hex(tMsg.message), "00") 'ボタン 16進
KeyStr = KeyList(tMsg.message) 'ボタン名
If Rc = -1 Then 'Down
UpDown = "Down"
ElseIf Rc = 1 Then 'Up
UpDown = "Up "
End If
End If
If EventName <> "" Then
EventTime = Format(tMsg.time - Time_Old, "@@@@@") '時間5桁
MousePos = Format(tMsg.pt.X, "@@@@") & "," & Format(tMsg.pt.Y, "@@@") 'マウス座標 4桁,3桁
With List1
.AddItem EventTime & vbTab & _
MousePos & vbTab & _
EventName & vbTab & _
UpDown & vbTab & _
KeyCode & vbTab & _
KeyStr
.ListIndex = .ListCount - 1 '最終行を選択
End With
Time_Old = tMsg.time '時間記憶
Pt_Old.X = tMsg.pt.X 'マウス位置記憶
Pt_Old.Y = tMsg.pt.Y
End If
Sleep 1
DoEvents
Loop While (MyMode = "Go")
End Sub
Private Sub Command2_Click()
MyMode = "" '中止
Command2.Enabled = False
Command1.Enabled = True
End Sub
Private Function EventsAnlyz(ByRef tMsg As Msg, Optional AllScan As Boolean) As Long
'
' イベントスキャン
' 変化を検知したらスキャンを中止
'
Dim pt As POINTAPI 'マウスポインタ座標
Dim Code As Long 'キー(or ボタン)コード
Dim Rc As Long
For Code = 1 To KEY_CNT
If KeyList(Code) <> "" Then 'スキャン対象?
Rc = GetAsyncKeyState(Code)
If (Rc And &H8001) <> 0 Then '下位2バイトの最上位ビット
KeyState(Code, 1) = 1 '今回、押されている
Else
KeyState(Code, 1) = 0 '今回、押されていない
End If
'--------------------
' 前回の状態と比較
'--------------------
KeyState(Code, 2) = KeyState(Code, 0) - KeyState(Code, 1) '変化
KeyState(Code, 0) = KeyState(Code, 1) '現在の状態を保存
If KeyState(Code, 2) <> 0 Then
EventsAnlyz = KeyState(Code, 2)
tMsg.message = Code
If AllScan = False Then Exit For 'スキャン中止
End If
End If
Next Code
Call GetCursorPos(pt)
tMsg.pt.X = pt.X
tMsg.pt.Y = pt.Y
tMsg.time = GetTickCount() '時間
End Function
Private Sub Form_Load()
Command1.Caption = "Go"
Command2.Caption = "Stop"
Label1.Caption = "マウスの動きとクリックをスキャンします。右の Go をクリック後、適当にマウスを動かし、クリックして見て下さい。"
List1.FontName = "MS ゴシック"
List1.FontSize = 12
Call DispTop(Me.hWnd, HWND_TOPMOST) '最前面表示
KeyList(&H1) = "LeftButton"
KeyList(&H2) = "RightButton"
KeyList(&H4) = "MiddleButton"
End Sub
Private Sub Form_Unload(Cancel As Integer)
End
End Sub
Public Function DispTop(hWnd As Long, Sw As Long) As Long
'最前面に表示
DispTop = SetWindowPos(hWnd, _
Sw, _
0, _
0, _
0, _
0, _
SWP_NOMOVE Or SWP_NOSIZE)
End Function