Имитация движения и кликов левой и правой кнопками мыши из кода VBA Excel. Эмуляция перемещения курсора и определение его текущих координат.
В VBA Excel нет методов и функций для имитации движения мыши и эмуляции кликов ее левой и правой кнопками. Но для этих целей, а также для определения текущих координат курсора, можно использовать встроенные функции Windows API — GetCursorPos, SetCursorPos и mouse_event.
Если эти функции Windows API объявить без ключевого слова Private, они будут доступны во всех модулях текущего проекта VBA.
Определение координат курсора
Определение текущих координат курсора из кода VBA Excel:
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 путем задания новых координат курсору:
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 |
Переменные добавлены в пример для наглядности, их можно не использовать:
А так можно задать множественные перескоки курсора мыши:
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 |
Здесь перескок мыши происходит один раз в секунду.
Уменьшив задержку выполнения цикла предыдущего примера с помощью другого цикла, можно ускорить перемещение курсора и сделать его более плавным:
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 |
Следующий пример показывает, как установить курсор мыши в заданное место экрана и сымитировать клик правой кнопкой мыши:
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, используемые в примерах, должны быть объявлены только один раз.
Фразы для контекстного поиска: положение курсора, имитация клика, эмуляция клика, эмуляция движения, имитация мыши, эмуляция мыши, координаты мыши, расположение мыши, расположение курсора.
Сообщение было отмечено как решение
Решение
Ура! Наконец-то разобрался как это сделать приемлимым способом =)
Подробно опишу весь процесс для таких же чайников как я сам, ибо на рускоязычных форумах фиг найдешь нормальное описание
Visual Basic | ||
|
Управление мышью осуществляется с помощью стандартной функции API Windows под названием «mouse_event», чтобы она заработала, надо вставить строку «Private Declare Sub mouse_event…» в точности, как показано сверху в коде VB. Для того чтобы указать этой функции, что конкретно надо сделать, нужно установить параметр dwFlags, который может принимать следующие значения:
Visual Basic | ||
|
Наиболее подробная информация о функциональности этих всех параметров содержится на сайте майкрософт (на английском) Например, с помощью параметра MOUSEEVENTF_ABSOLUTE можно задавать координаты мыши с высокой точностью в диапазоне от 0 до 65535 по осям x и y. Правда мне так и не удалось понять, как работает этот параметр, у меня он вобще никакого влияния не оказывал на перемещение курсора, как я только над ним не извращался =)
Помучавшись, обнаружил прекрасную функцию «SetCursorPos», которая так же входит в стандартный набор Виндоус. Она четко ставит укозатель мыши в нужную позицию с координатами, соответствующими разрешению экрана (Например от 0х0 до 1280х800) независимо от настроек чувствительности и ускорения мыши, что очень удобно.
Для работы с медленно прогружающимися объектами (например с сайтами в интернете или тяжеловесными программами) бывает необходимо добавить временную задержку между кликами мыши на различные меню. Поскольку в VBA повидимому нет объекта типа таймера, то вместо него отлично подходит ещё одна стандартная функция Виндовс «Sleep», которая позваляет задавать задержку в милисекундах, что бывает даже удобнее.
Мне необходимо было использовать в своей основной программе две вещи — это перетаскивание объекта из точки 1 в точку 2 и клик мышкой в точке с заданными координатами (например на кнопку). Для реализации каждого из этих действий можно использовать связку из нескольких функций «SetCursorPos» и «mouse_event», но удобнее написать свои процедуры, котарые потом вставлять каждый раз в нужное место, что я и сделал в виде процедур «MouseDragging» и «MouseClick».
Процедура «MouseDragging(x1, y1, x2, y2)» с помощью функции «SetCursorPos(x1, y1)» устанавливает курсор над нужным объектом в координатах (x1, y1), затем с помощью «mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0» нажимает левую кнопку мыши и как бы удерживая её, перетаскивает обект в точку с координатами (x2, y2) с помощью функции «SetCursorPos(x2, y2)». Затем отпускает кнопку мыши с помощью функции «mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0».
С помощью процедуры «MouseDragging(x1, y1, x2, y2)» можно также выделить область текста в Ворде, несколько объектов в Экселе, Автокаде или часть изображения в Пэйнте.
Процедура «MouseClick(x, y)» выполняет клик мышью в точке с координатами (x, y). Сначала устанавливает указатель мыши с помощью функции «SetCursorPos(x, y)» в нужной точке, затем с помощью функции «mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0» совершает клик мышью в этой точке. Причем интересно, что запись параметра dwFlags в виде «MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP» сразу же обеспечивает и нажатие левой кнопки мыши и отпускание.
Здесь x, y, x1, y1, x2, y2 играют роль параметров, вместо которых мы при вызове процедур подставляем нужные нам значения.
Теперь вставляем всё это в процедуру нажатия на кнопку Button1, расположенную где-нибудь на нашей форме, и получаем следующее: при нажатии на кнопку происходит задержка 0,5 секунды, затем перетаскивание объекта из координат (889, 490) в точку с координатами (388, 467), затем после задержки в 2,0 секунды выполняется клик мышкой в точке с координатами (768, 419)
Может быть кому-то покажется странным такое длинное описание столь простой задачи, но мне пришлось потратить около месяца времени, чтобы разобраться во всем этом и найти подходящие решения. Надеюсь что данное описание поможет таким же чайникам как я разобраться в этом гораздо быстрее
19
Содержание
- MouseDown, MouseUp events
- Syntax
- Settings
- Remarks
- See also
- Support and feedback
- Click event
- Syntax
- Remarks
- See also
- Support and feedback
- События MouseDown, MouseUp
- Синтаксис
- Settings
- Замечания
- См. также
- Поддержка и обратная связь
MouseDown, MouseUp events
Occur when the user clicks a mouse button. MouseDown occurs when the user presses the mouse button; MouseUp occurs when the user releases the mouse button.
Syntax
For MultiPage, TabStrip
Private Subobject _MouseDown(indexAs Long,
ByValButtonAs fmButton,
ByValShiftAs fmShiftState,
ByValXAs Single,
ByValYAs Single) Private Subobject _MouseUp(indexAs Long,
ByValButtonAs fmButton,
ByValShiftAs fmShiftState,
ByValXAs Single,
ByValYAs Single)
For other controls
Private Subobject _MouseDown( ByValButtonAs fmButton,
ByValShiftAs fmShiftState,
ByValXAs Single,
ByValYAs Single) Private Subobject _MouseUp( ByValButtonAs fmButton,
ByValShiftAs fmShiftState,
ByValXAs Single,
ByValYAs Single)
The MouseDown and MouseUp event syntaxes have these parts:
Part | Description |
---|---|
object | Required. A valid object. |
index | Required. The index of the page or tab in a MultiPage or TabStrip with the specified event. |
Button | Required. An integer value that identifies which mouse button caused the event. |
Shift | Required. The state of SHIFT, CTRL, and ALT. |
X, Y | Required. The horizontal or vertical position, in points, from the left or top edge of the form, Frame, or Page. |
Settings
The settings for Button are:
Constant | Value | Description |
---|---|---|
fmButtonLeft | 1 | The left button was pressed. |
fmButtonRight | 2 | The right button was pressed. |
fmButtonMiddle | 4 | The middle button was pressed. |
The settings for Shift are:
Value | Description |
---|---|
1 | SHIFT was pressed. |
2 | CTRL was pressed. |
3 | SHIFT and CTRL were pressed. |
4 | ALT was pressed. |
5 | ALT and SHIFT were pressed. |
6 | ALT and CTRL were pressed. |
7 | ALT, SHIFT, and CTRL were pressed. |
You can identify individual keyboard modifiers by using the following constants:
Constant | Value | Description |
---|---|---|
fmShiftMask | 1 | Mask to detect SHIFT. |
fmCtrlMask | 2 | Mask to detect CTRL. |
fmAltMask | 4 | Mask to detect ALT. |
For a MultiPage, the MouseDown event occurs when the user presses a mouse button over the control.
For a TabStrip, the index argument identifies the tab where the user clicked. An index of -1 indicates the user did not click a tab. For example, if there are no tabs in the upper-right corner of the control, clicking in the upper-right corner sets the index to -1.
For a form, the user can generate MouseDown and MouseUp events by pressing and releasing a mouse button in a blank area, record selector, or scroll bar on the form.
The sequence of mouse-related events is:
MouseDown or MouseUp event procedures specify actions that occur when a mouse button is pressed or released. MouseDown and MouseUp events enable you to distinguish between the left, right, and middle mouse buttons. You can also write code for mouse-keyboard combinations that use the SHIFT, CTRL, and ALT keyboard modifiers.
If a mouse button is pressed while the pointer is over a form or control, that object «captures» the mouse and receives all mouse events up to and including the last MouseUp event. This implies that the X, Y mouse-pointer coordinates returned by a mouse event may not always be within the boundaries of the object that receives them.
If mouse buttons are pressed in succession, the object that captures the mouse receives all successive mouse events until all buttons are released.
Use the Shift argument to identify the state of SHIFT, CTRL, and ALT when the MouseDown or MouseUp event occurred. For example, if both CTRL and ALT are pressed, the value of Shift is 6.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
Click event
Occurs in one of two cases:
- The user clicks a control with the mouse.
- The user definitively selects a value for a control with more than one possible value.
Syntax
For MultiPage, TabStrip:
Private Subobject _Click(indexAs Long)
For all other controls:
Private Subobject _Click( )
The Click event syntax has these parts:
Part | Description |
---|---|
object | Required. A valid object. |
index | Required. The index of the page or tab in a MultiPage or TabStrip associated with this event. |
Of the two cases where the Click event occurs, the first case applies to the CommandButton, Frame, Image, Label, ScrollBar, and SpinButton.
The second case applies to the CheckBox, ComboBox, ListBox, MultiPage, TabStrip, and ToggleButton. It also applies to an OptionButton when the value changes to True.
The following are examples of actions that initiate the Click event:
Clicking a blank area of a form or a disabled control (other than a list box) on the form.
Clicking a CommandButton. If the command button doesn’t already have the focus, the Enter event occurs before the Click event.
Pressing the SPACEBAR when a CommandButton has the focus.
Clicking a control.
Pressing ENTER on a form that has a command button whose Default property is set to True, as long as no other command button has the focus.
Pressing ESC on a form that has a command button whose Cancel property is set to True, as long as no other command button has the focus.
When the Click event results from clicking a control, the sequence of events leading to the Click event is:
For some controls, the Click event occurs when the Value property changes. However, using the Change event is the preferred technique for detecting a new value for a property. The following are examples of actions that initiate the Click event due to assigning a new value to a control:
Clicking a different page or tab in a MultiPage or TabStrip. The Value property for these controls reflects the current Page or Tab. Clicking the current page or tab does not change the control’s value and does not initiate the Click event.
Clicking a CheckBox or ToggleButton, pressing the SPACEBAR when one of these controls has the focus, pressing the accelerator key for one of these controls, or changing the value of the control in code.
Changing the value of an OptionButton to True. Setting one OptionButton in a group to True sets all other buttons in the group to False, but the Click event occurs only for the button whose value changes to True.
Selecting a value for a ComboBox or ListBox so that it unquestionably matches an item in the control’s drop-down list. For example, if a list is not sorted, the first match for characters typed in the edit region may not be the only match in the list, so choosing such a value does not initiate the Click event. In a sorted list, you can use entry-matching to ensure that a selected value is a unique match for text the user types.
The Click event is not initiated when Value is set to Null.
Clicking changes the value of a control, thus it initiates the Click event. When you right-click, the value of the control does not change, so it does not initiate the Click event.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
События MouseDown, MouseUp
Выполняются при щелчке кнопкой мыши. Событие MouseDown выполняется, когда пользователь нажимает кнопку мыши, а MouseUp — когда отпускает.
Синтаксис
Для MultiPage— TabStrip
Частныйобъект Sub _MouseDown(indexAs Long,
Кнопка ByVal Как fmButton,
ByValShift— fmShiftState,
ByValXкак одиночный,
ByValYAs Single)Private Subobject _MouseUp(indexAs Long,
Кнопка ByVal Как fmButton,
ByValShift— fmShiftState,
ByValXкак одиночный,
ByValYкак одиночный)
Для других элементов управления
Частныйобъект Sub _MouseDown( ByValButtonAs fmButton,
ByValShift— fmShiftState,
ByValXкак одиночный,
ByValYAs Single)Private Subobject _MouseUp( ByValButtonAs fmButton,
ByValShift— fmShiftState,
ByValXкак одиночный,
ByValYкак одиночный)
Синтаксис событий MouseDown и MouseUp включает следующие элементы:
Part | Описание |
---|---|
object | Обязательно. Допустимый объект. |
index | Обязательно. Индекс страницы или вкладки в MultiPage или TabStrip с указанным событием. |
Button | Обязательно. Целое число, обозначающее кнопку мыши, вызвавшую событие. |
Shift | Обязательно. Состояние клавиш SHIFT, CTRL и ALT. |
X, Y | Обязательно. Горизонтальное или вертикальное положение в точках от левого или верхнего края формы, рамки или страницы. |
Settings
Аргумент Button может принимать следующие значения:
Константа | Значение | Описание |
---|---|---|
fmButtonLeft | 1 | Нажата левая кнопка. |
fmButtonRight | 2 | Нажата правая кнопка. |
fmButtonMiddle | 4 | Нажата средняя кнопка. |
Аргумент Shift может принимать следующие значения:
Значение | Описание |
---|---|
1 | Клавиша SHIFT была нажата. |
2 | Клавиша CTRL была нажата. |
3 | Клавиши SHIFT и CTRL были нажаты. |
4 | Клавиша ALT была нажата. |
5 | Клавиши ALT и SHIFT были нажаты. |
6 | Клавиши ALT и CTRL были нажаты. |
7 | Клавиши ALT, SHIFT и CTRL были нажаты. |
Вы можете индивидуально указать клавиши CTRL, SHIFT или ALT, используя следующие константы:
Константа | Значение | Описание |
---|---|---|
fmShiftMask | 1 | Маска для определения клавиши SHIFT. |
fmCtrlMask | 2 | Маска для определения клавиши CTRL. |
fmAltMask | 4 | Маска для определения клавиши ALT. |
Замечания
Для MultiPage событие MouseDown возникает, когда пользователь нажимает кнопку мыши на элемент управления.
Для tabStrip аргумент index определяет вкладку, на которой щелкнул пользователь. Индекс -1 указывает, что пользователь не щелкнул вкладку. Например, если в правом верхнем углу элемента управления нет вкладок, при щелчке в правом верхнем углу индексу присваивается значение -1.
События MouseDown и MouseUp для формы выполняются, когда пользователь нажимает и отпускает кнопку мыши в пустой области, на указателе записи или полосе прокрутки формы.
События, связанные с мышью, выполняются в следующем порядке:
Процедуры событий MouseDown и MouseUp содержат действия, выполняющиеся, когда пользователь нажимает или отпускает кнопку мыши. События MouseDown и MouseUp позволяют различать нажатия левой, правой и средней кнопок мыши. Также можно написать код для сочетаний мыши и клавиатуры, использующих модификаторы клавиш SHIFT, CTRL и ALT.
Если в момент нажатия кнопки мыши указатель находится на форме или элементе управления, этот объект «захватывает» мышь и получает все события, связанные с мышью, до события MouseUp включительно. При этом подразумевается, что координаты указателя X и Y, возвращаемые событием, могут не находиться в пределах объекта, получающего их.
Если кнопки мыши нажаты последовательно, объект, захватывающий мышь, последовательно получает все события, пока все кнопки не будут отпущены.
Аргумент Shift используется для определения состояния клавиш SHIFT, CTRL и ALT при выполнении событий MouseDown и MouseUp. Например, если нажаты клавиши CTRL и ALT, аргумент Shift принимает значение 6.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
You could use Excel VBA to move the mouse and click on things (left and right click). Below is an example of moving the mouse to the top left of the screen and then clicking. Just copy the code and paste it into macro window in Excel.
The SingleClick() subroutine is a single click, while DoubleClick() subroutine does a double click. The code is quite self explanatory and needs minimal instructions.
Note that SetCursorPos moves the mouse based on the coordinates supplied. The first parameter is the # of pixels to the right from the top left corner of the monitor (x-axis) and the second parameter is the # of pixels below the top left corner of the monitor (y-axis). If the user is using duel monitors, it will be top left corner of the the left most monitor.
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Public Declare 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) Public Const MOUSEEVENTF_LEFTDOWN = &H2 Public Const MOUSEEVENTF_LEFTUP = &H4 Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8 Public Const MOUSEEVENTF_RIGHTUP As Long = &H10 Private Sub SingleClick() SetCursorPos 100, 100 'x and y position mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End Sub Private Sub DoubleClick() 'Double click as a quick series of two clicks SetCursorPos 100, 100 'x and y position mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End Sub Private Sub RightClick() 'Right click SetCursorPos 200, 200 'x and y position mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 End Sub
20 people found this article useful
20 people found this article useful
visors16
Пользователь
Сообщений: 210
Регистрация: 07.10.2016
Здравствуйте, господа программисты.
Помогите разобраться.
Есть код, который вроде должен эмулировать нажатие ПРАВОЙ кнопки мышки — в некую координату на экране.
Однако я не понимаю — как прицепить этот макрос к кнопке.
Как заставить этот макрос эмулировать нажатие ПРАВОЙ кнопки мышки — в точку экрана с координатами (100;200) ?
Вот сам код с описанием:
Код |
---|
'Подключение функции API Windows "mouse_event" из Виндосовской библиотеки "user32", которая позваляет управлять мышью Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal dwData As Long, ByVal dwExtraInfo As Long) 'Значения параметра dwFlags, определяющие поведение функции mouse_event Private Const MOUSEEVENTF_LEFTDOWN = &H2 'Нажать левую кнопку Private Const MOUSEEVENTF_LEFTUP = &H4 'Отпустить левую кнопку 'Подключение функции API Windows "SetCursorPos", которая устанавливает позицию курсора мыши по координатам, соответствующим разрешению вашего монитора Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long 'Подключение функции API Windows "Sleep", её можно использовать вместо таймера, выставляя задержки в милисекундах Private Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long) Sub MouseDragging(x1, y1, x2, y2) 'Перетаскивание объекта из координаты (x1,y1) в координаты (x2,y2)или выделение текста/изображения в прямоугольной области (x1, y1; x2, y2) Call SetCursorPos(x1, y1) mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 Call SetCursorPos(x2, y2) mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End Sub Sub MouseClick(x, y) 'Клик мыши по координатам (x,y) Call SetCursorPos(x, y) mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End Sub Private Sub CommandButton1_Click() Sleep (500) Call MouseDragging(889, 490, 388, 467) Sleep (2000) Call MouseClick(768, 419) End Sub |
Возможные значения параметра dwFlags, определяющие поведение функции mouse_event
Private Const MOUSEEVENTF_RIGHTDOWN = &H8 ‘Нажать правую кнопку
Private Const MOUSEEVENTF_RIGHTUP = &H10 ‘Отпустить правую кнопку
Прикрепленные файлы
- 3233.xls (36.5 КБ)
Изменено: visors16 — 28.03.2017 20:43:55