2013-05-28 7 views
4

Я создал класс для записи действий мыши, например, для записи задачи с помощью мыши (переместите мышь здесь и нажмите левую кнопку там и ... это.)Запись мыши Средняя кнопка и колесо прокрутки

После записи действий/задачи мыши я могу воспроизвести ее из класса с потоком, который я создал.

Что мне нужно, чтобы реализовать среднюю кнопку мыши и свитков Wheel тоже, но я не знаю, как сделать это, было немного трудно для меня, чтобы использовать и понимать "GetAsyncKeyState "и я не могу найти информацию о" Состояние средней кнопки GetAsyncKeyState "или колесо прокрутки (для прокрутки вниз/вверх).

#Region " Record Mouse Class " 

' [ Record Mouse Functions ] 
' 
' // By Elektro [email protected] 
' 
' Examples : 
' Record_Mouse.Start_Record() 
' Record_Mouse.Stop_Record() 
' Record_Mouse.Play() : While Not Record_Mouse.Play_Is_Completed : Application.DoEvents() : End While 
' Record_Mouse.Mouse_Speed = 50 

Public Class Record_Mouse 

''' <summary> 
''' Sets the speed of recording/playing the mouse actions. 
''' Default value is 25. 
''' </summary> 
Public Shared Mouse_Speed As Int64 = 25 

''' <summary> 
''' Gets the status pf the current mouse play. 
''' False = mouse task is still playing. 
''' True = Mouse task play is done. 
''' </summary> 
Public Shared Play_Is_Completed As Boolean = False 

' Where the mouse coordenates will be stored: 
Private Shared Coordenates_List As New List(Of Point) 
' Where the mouse clicks will be stored: 
Private Shared Clicks_Dictionary As New Dictionary(Of Int64, MouseButton) 
' Timer to record the mouse: 
Private Shared WithEvents Record_Timer As New Timer 
' Button click count to rec/play clicks: 
Private Shared Click_Count As Int32 = 0 
' Thread to reproduce the mouse actions: 
Private Shared Thread_MousePlay_Var As System.Threading.Thread = New Threading.Thread(AddressOf Thread_MousePlay) 
' API to record the current mouse button state: 
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer 
' API to reproduce a mouse button click: 
Private Declare Sub Mouse_Event Lib "User32" Alias "mouse_event" (ByVal dwFlags As MouseButton, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As Integer) 
' GetAsyncKeyState buttons status 
Private Shared Last_ClickState_Left As Int64 = -1 
Private Shared Last_ClickState_Right As Int64 = -1 

Enum MouseButton 

    Left_Down = &H2 ' Left button (hold) 
    Left_Up = &H4  ' Left button (release) 

    Right_Down = &H8 ' Right button (hold) 
    Right_Up = &H10 ' Right button (release) 

    Middle_Down = &H20 ' Middle button (hold) 
    Middle_Up = &H40 ' Middle button (release) 

    Left    ' Left button (press) 
    Right    ' Right button (press) 
    Middle    ' Middle button (press) 

End Enum 

''' <summary> 
''' Starts recording the mouse actions over the screen. 
''' It records the position of the mouse and left/right button clicks. 
''' </summary> 
Public Shared Sub Start_Record() 
    Play_Is_Completed = False 
    Record_Timer.Interval = Mouse_Speed 
    Coordenates_List.Clear() : Clicks_Dictionary.Clear() : Click_Count = 0 
    Record_Timer.Start() 
End Sub 

''' <summary> 
''' Stop recording the mouse actions. 
''' </summary> 
Public Shared Sub Stop_Record() 
    Record_Timer.Stop() 
End Sub 

''' <summary> 
''' Reproduce the mouse actions. 
''' </summary> 
Public Shared Sub Play() 
    Thread_MousePlay_Var = New Threading.Thread(AddressOf Thread_MousePlay) 
    Thread_MousePlay_Var.IsBackground = True 
    Thread_MousePlay_Var.Start() 
End Sub 

' Procedure used to store the mouse actions 
Private Shared Sub Record_Timer_Tick(sender As Object, e As EventArgs) Handles Record_Timer.Tick 

    Coordenates_List.Add(Control.MousePosition) 

    If Not Last_ClickState_Left = GetAsyncKeyState(1) Then 
     Last_ClickState_Left = GetAsyncKeyState(1) 
     If GetAsyncKeyState(1) = 32768 Then 
      Click_Count += 1 
      Coordenates_List.Add(Nothing) 
      Clicks_Dictionary.Add(Click_Count, MouseButton.Left_Down) 
     ElseIf GetAsyncKeyState(1) = 0 Then 
      Click_Count += 1 
      Coordenates_List.Add(Nothing) 
      Clicks_Dictionary.Add(Click_Count, MouseButton.Left_Up) 
     End If 
    End If 

    If Not Last_ClickState_Right = GetAsyncKeyState(2) Then 
     Last_ClickState_Right = GetAsyncKeyState(2) 
     If GetAsyncKeyState(2) = 32768 Then 
      Click_Count += 1 
      Coordenates_List.Add(Nothing) 
      Clicks_Dictionary.Add(Click_Count, MouseButton.Right_Down) 
     ElseIf GetAsyncKeyState(2) = 0 Then 
      Click_Count += 1 
      Coordenates_List.Add(Nothing) 
      Clicks_Dictionary.Add(Click_Count, MouseButton.Right_Up) 
     End If 
    End If 

End Sub 

' Procedure to play a mouse button (click) 
Private Shared Sub Mouse_Click(ByVal MouseButton As MouseButton) 
    Select Case MouseButton 
     Case MouseButton.Left : Mouse_Event(MouseButton.Left_Down, 0, 0, 0, 0) : Mouse_Event(MouseButton.Left_Up, 0, 0, 0, 0) 
     Case MouseButton.Right : Mouse_Event(MouseButton.Right_Down, 0, 0, 0, 0) : Mouse_Event(MouseButton.Right_Up, 0, 0, 0, 0) 
     Case MouseButton.Middle : Mouse_Event(MouseButton.Middle_Down, 0, 0, 0, 0) : Mouse_Event(MouseButton.Middle_Up, 0, 0, 0, 0) 
     Case Else : Mouse_Event(MouseButton, 0, 0, 0, 0) 
    End Select 
End Sub 

' Thread used for reproduce the mouse actions 
Private Shared Sub Thread_MousePlay() 

    Click_Count = 0 

    For Each Coordenate In Coordenates_List 

     Threading.Thread.Sleep(Mouse_Speed) 

     If Coordenate = Nothing Then 
      Click_Count += 1 
      If Click_Count > 1 Then Mouse_Click(Clicks_Dictionary.Item(Click_Count)) 
     Else 
      Cursor.Position = Coordenate 
     End If 

     Application.DoEvents() 

    Next 

    Play_Is_Completed = True 

End Sub 

End Class 

#End Region 
+0

Полагает, что вы делаете это более сложным, чем это должно быть. Все, что вы пытаетесь записать, уже отображается как события в .net. Все кнопки, один клик, двойной щелчок, колесо. MouseEventArgs предоставляет все необходимые свойства – tinstaafl

+0

@tinstaafl спасибо за ваш комментарий, но MouseEventArgs предназначены только для событий внутри формы, а не снаружи, я прав? исправьте меня, если не понравится, так или иначе, я не могу представить, как это сделать с помощью mouseventargs, может быть, если вы можете ответить на пример лучшего способа сделать это ... спасибо в любом случае. – ElektroStudios

+0

Хорошо. Я ничего не видел в вашем OP, чтобы сказать, что вы пытались сделать эту систему в целом. Вот [статья] (http://msdn.microsoft.com/en-us/library/ms644990.aspx), которая может вам помочь – tinstaafl

ответ

7

Вы можете получить среднюю кнопку мыши с помощью GetAsyncKeyState (4). Но с этим подходом вы никогда не получите сообщения прокрутки мыши, нет способа запросить позицию кнопки прокрутки. Вы должны полагаться на сообщение Window, сообщающее вам, что мышь была прокручена, WM_MOUSEWHEEL.

Требование записи записи, даже если ваше собственное окно не имеет фокуса, требует принципиально иного подхода, вам нужно использовать крючок низкого уровня. Крюк, установленный SetWindowsHookEx(), вызовет метод в вашей программе, когда произойдет событие мыши.

Нет смысла публиковать код для этого, есть лотов образцов, доступных для этого в Интернете. Правильный запрос Google для него - «vb.net setwindowshookex wh_mouse_ll». The first hit уже очень хорошо, статья Microsoft KB содержит почти все, что вам нужно. То, как он использует SetWindowsHookEx(), нуждается в настройке, так как показано, что он будет записывать только события мыши для вашей собственной программы. Вместо этого используйте LoadLibrary («user32.dll») и передайте возвращаемое значение в качестве 3-го аргумента, 0 для 4-го аргумента, чтобы заставить его записывать каждое событие мыши.

+0

Спасибо, действительно, я не могу сделать этот низкоуровневый крючок, не принимая пример VB, и если этот пример для WM-MOUSEWHEEL в то время как все примеры, которые я нахожу, предназначены для C# с вещами, которые я не могу перевести с помощью переводчиков или самостоятельно и с помощью указателей на C#, я думаю, что я сделаю другой вопрос о крючках, если вы не сможете опубликовать код, еще раз спасибо. – ElektroStudios

+0

Microsoft Статья в KB предназначена для VB.NET, просто скопируйте/вставьте код. Я не хочу воспроизводить его здесь и не обновлять его при изменении статьи в KB, просто нет смысла на это. Даже не уверен, что это законно. звучит как непреодолимая проблема, а затем просто продолжайте на полке, пока вы не узнаете больше. –

+0

Возможно, проблема в критериях поиска в моей стране, но когда я просматриваю «vb.net setwindowshookex wm_mouse_ll» в google.com и google.es, на первых трех страницах результатов нет какой-либо статьи в KB, можете ли вы опубликовать ссылку, пожалуйста? Я вижу статью MSDN (которой нет в VB), но любая статья Microsoft KB. – ElektroStudios

Смежные вопросы