Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как заставить на VB 6 мышь имитировать нажатие? (http://forum.oszone.net/showthread.php?t=232953)

Az_Esim 16-04-2012 16:45 1900809

Как заставить на VB 6 мышь имитировать нажатие?
 
Мне нужно чтобы мышь вне рабочей формы, имитировала нажатие кнопки. т.е. если есть Form.exe открываем и мышь имитирует нажатие ЛКМ. не только в самой форме но и на рабочем столе куда не передвинешь мышь, она постоянно кликает (надеюсь достпуно изложил суть. :) )

softter 16-04-2012 17:15 1900824

Будет более понятно, если вы изложите практическую цель такой имитиации. Т.е. смысл, для чего это нужно.

Az_Esim 16-04-2012 17:37 1900836

приведу такой пример:
включается компьютер и выходит обычное извещение об ошибке, прочитав нажимаете "ОК", окошко закрывается.
Но через 5 мин оно опять выходит, и для того чтобы его закрыть вам нужно нажать "ОК" (после чего как вы догадываетесь процедура повториться).
Вот мне и нужно (очень нужно) чтобы мышь, вне окна name.exe (созданный в VB 6) имитировала мои клики.
(т.е. я оставлю комп влюченым, курсор мыши будет стоять на том месте где как раз появиться окошко с кнопкой "ОК" и будет кликать. )

ferget 17-04-2012 02:34 1901079

Возьмите AutoIt, в комплекте идет программа Au3Record, для записи действий

ждете окно ошибки, включаете запись, нажимаете кнопку, получаете скрипт и делаете действие в бесконечном цикле

softter 17-04-2012 13:20 1901225

Да, такое возможно. Делал в свое время подобную программу, но исходников уже нет. Средствами VBA этого не сделать, нужно использовать API Windows. Алгоритм примерно следующий:


Создаете в своей программе таймер с интервалом ~100 мс.

В таймере срабатывает функция, которая ищет нужное вам окно по уникальному заголовку (если он есть) или по имени его класса. Получаете его Хэндел.


Если окно найдено, по его Хэнделу ищите в нем дочернее окно (кнопку) по имени класса и определяете его Хэндел. Имя класса окна можно определить любым оконным шпионом, оно в отличие от Хендла всегда неизменно.
Затем имея Хэндел кнопки, можно определить ее координаты на экране монитора X и Y. Имея координаты окна, переносим на него мышь и имитируем клик.

Если код будет использоваться на одном ПК, окно выскакивает в одном и том же месте и разрешение монитора меняться не будет, значения X и Y можно не искать а жестко прописать в коде программы, предварительно определив их оконным шпионом.


Вот сам код имитации клика, написано на VB6


Код:

Для имитации нажатия на клавишу мыши служит API-функция mouse_event

 Private 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)

 dwFlags - означает, какое событие в данный момент должно происходит
 dx,dy - величины, характеризующие перемещение курсора от текущего положения курсора
 dx - перемещение по горизонтали (если значение положительное - перемещение идет вправо, если отрицательно - влево)
 dy - перемещение по вертикали (если значение положительное - перемещение идет вниз, если отрицательно - вверх).

 Пример использования функции: неоходимо переместить курсор из текущей точки нахождения курсора в точку с координатами (851,143) и в этой точке имитировать нажатие левой клавиши мыши

 Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
 Private Type POINTAPI
 x As Long
 y As Long
 End Type
 Dim z As POINTAPI
 Private 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)
 Const MOUSEEVENTF_ABSOLUTE = &H8000
 Const MOUSEEVENTF_LEFTDOWN = &H2
 Const MOUSEEVENTF_LEFTUP = &H4
 Const MOUSEEVENTF_MIDDLEDOWN = &H20
 Const MOUSEEVENTF_MIDDLEUP = &H40
 Const MOUSEEVENTF_MOVE = &H1
 Const MOUSEEVENTF_RIGHTDOWN = &H8
 Const MOUSEEVENTF_RIGHTUP = &H10
 Private Sub Form_Load()
 GetCursorPos z 'получить текущее значение местоположения курсора
 zx = (851 - z.x) / 2 'необходимо разделить полученное значение на 2. С чем это связано, я не знаю. А вы?
 zy = (143 - z.y) / 2
 mouse_event MOUSEEVENTF_MOVE, zx, zy, 0&, 0& 'перемещение курсора
 mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0& 'нажатие на левую клавишу мыши
 mouse_event MOUSEEVENTF_LEFTUP, 0&, 0&, 0&, 0& 'отпускание левой клавиши мыши
 End Sub

 'Примеры использования

 Private 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)
 Const MOUSEEVENTF_ABSOLUTE = &H8000
 Const MOUSEEVENTF_LEFTDOWN = &H2
 Const MOUSEEVENTF_LEFTUP = &H4
 Const MOUSEEVENTF_MIDDLEDOWN = &H20
 Const MOUSEEVENTF_MIDDLEUP = &H40
 Const MOUSEEVENTF_MOVE = &H1
 Const MOUSEEVENTF_RIGHTDOWN = &H8
 Const MOUSEEVENTF_RIGHTUP = &H10

 'Имитация клика:
 mouse_event MOUSEEVENTF_LEFTDOWN, lpPoint.x, lpPoint.y, 0&, 0&
 mouse_event MOUSEEVENTF_LEFTUP, lpPoint.x, lpPoint.y, 0&, 0&



Время: 12:45.

Время: 12:45.
© OSzone.net 2001-