Имитация движения и кликов левой и правой кнопками мыши из кода VBA Excel. Эмуляция перемещения курсора и определение его текущих координат.
В VBA Excel нет методов и функций для имитации движения мыши и эмуляции кликов ее левой и правой кнопками. Но для этих целей, а также для определения текущих координат курсора, можно использовать встроенные функции Windows API — GetCursorPos, SetCursorPos и mouse_event.
Если эти функции Windows API объявить без ключевого слова Private, они будут доступны во всех модулях текущего проекта VBA.
Определение координат курсора
Определение текущих координат курсора из кода VBA Excel:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Option Explicit Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Type POINTAPI X As Long Y As Long End Type Sub Get_Cursor() Dim myPoint As POINTAPI GetCursorPos myPoint Debug.Print "Координата X: " & myPoint.X & vbNewLine & _ "Координата Y: " & myPoint.Y & vbNewLine End Sub |
Скопируйте представленный выше код в стандартный модуль и кликните мышью внутри процедуры Get_Cursor()
. Затем, перемещайте курсор мыши по экрану, не нажимая кнопок, чтобы мигающая вертикальная линия (точка вставки) не ушла из процедуры, и нажимайте клавишу F5. В окне Immediate будут печататься текущие координаты курсора. Клавишу F5 можно нажимать одновременно с процессом перемещения мыши. Значения координат X и Y отображаются в пикселях.
Имитация движения мыши
Имитация движения мыши, а, точнее, перескока мыши из одной точки в другую, осуществляется из кода VBA Excel путем задания новых координат курсору:
1 2 3 4 5 6 7 8 9 10 |
Option Explicit Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long Sub Set_Cursor() Dim myX As Long, myY As Long myX = 600 myY = 400 'Задаем курсору новые координаты SetCursorPos myX, myY End Sub |
Переменные добавлены в пример для наглядности, их можно не использовать:
1 |
SetCursorPos 600, 400 |
А так можно задать множественные перескоки курсора мыши:
1 2 3 4 5 6 7 |
Sub Many_Set_Cursor() Dim i As Long For i = 1 To 600 Step 20 Application.Wait Now + TimeValue("0:00:01") SetCursorPos i, i Next End Sub |
Здесь перескок мыши происходит один раз в секунду.
Уменьшив задержку выполнения цикла предыдущего примера с помощью другого цикла, можно ускорить перемещение курсора и сделать его более плавным:
1 2 3 4 5 6 7 8 9 |
Sub Many_Set_Cursor_2() Dim i As Long, i2 As Long, a As Long For i = 1 To 600 For i2 = 1 To 100000 a = i2 / 2 Next SetCursorPos i, i Next End Sub |
Здесь уже более похоже на имитацию движения мыши.
Имитация кликов мыши
Чтобы воспроизвести имитацию кликов левой и правой кнопками мыши, нам понадобятся коды событий кнопок мыши:
Событие | Код |
---|---|
Нажать левую кнопку | &H2 |
Отпустить левую кнопку | &H4 |
Нажать правую кнопку | &H8 |
Отпустить правую кнопку | &H10 |
Следующий пример показывает, как установить курсор мыши в заданное место экрана и сымитировать клик правой кнопкой мыши:
1 2 3 4 5 6 7 8 9 10 11 12 |
Option Explicit Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Sub Set_Cursor_and_RightClick() 'Устанавливаем курсор в нужную точку экрана SetCursorPos 800, 600 'Нажимаем правую кнопку мыши mouse_event &H8, 0, 0, 0, 0 'Отпускаем правую кнопку мыши mouse_event &H10, 0, 0, 0, 0 End Sub |
Я выбрал для примера имитацию клика правой кнопкой мыши из-за большей наглядности (за счет отображения контекстного меню).
Обратите внимание, что функции Windows API, используемые в примерах, должны быть объявлены только один раз.
Фразы для контекстного поиска: положение курсора, имитация клика, эмуляция клика, эмуляция движения, имитация мыши, эмуляция мыши, координаты мыши, расположение мыши, расположение курсора.