Как сделать клик вне своего приложения?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Борис
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 22.05.2004 (Сб) 12:54

Как сделать клик вне своего приложения?

Сообщение Борис » 22.05.2004 (Сб) 15:22

Возникла такая проблема: мне из меей программы необходимо сделать клик в окне другой программы по заранее определенным координатам мыши. Проблема в том, что клик необходимо сделать программно, а не мышью непосредственно (т.е. без перемещения мыши в нужную точку). :shock:

Может кто подскажет, какими АPI функциями можно воспользоваться для этой цели? :?:

Вообще какие АPI функции задействованы в тот момент, когда происходит клик мышью по какому-либо окну или ярлыку? :?:
До встречи на форуме!

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 22.05.2004 (Сб) 17:25

Код: Выделить всё
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_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Sub Click()
mouse_event 2 OR 4, X, Y, cbutt, dwEI
End Sub
Нет меня больше

Борис
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 22.05.2004 (Сб) 12:54

Сообщение Борис » 22.05.2004 (Сб) 17:51

A.A.Z. писал(а):
Код: Выделить всё
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_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Sub Click()
mouse_event 2 OR 4, X, Y, cbutt, dwEI
End Sub


Огромное спасибо!
Мои подозрения относительно данной функции, т.е. mouse_event, подтвердились. К сожалению, в доступных мне источниках не удалось найти описание этой функции, а также передаваемых ей параметров. Поэтому и пошел с моим вопросиком на форум.:D

Не сочтите за труд, уважаемый А.А.Z.. сообщить мне эту информацию, если, конечно Вы ей располагаете и имеете на то желание. :wink:
До встречи на форуме!

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 22.05.2004 (Сб) 18:59

Объявление функции
Код: Выделить всё
Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)


Описание параметров:

· dwFlags
A set of flag bits that specify various aspects of mouse motion and button clicking. The bits in this parameter can be any reasonable combination of the following values:
MOUSEEVENTF_ABSOLUTE
Specifies that the dx and dy parameters contain normalized absolute coordinates. If not set, those parameters contain relative data: the change in position since the last reported position. This flag can be set, or not set, regardless of what kind of mouse or mouse-like device, if any, is connected to the system. For further information about relative mouse motion, see the following Remarks section.
MOUSEEVENTF_MOVE
Specifies that movement occurred.
MOUSEEVENTF_LEFTDOWN
Specifies that the left button changed to down.
MOUSEEVENTF_LEFTUP
Specifies that the left button changed to up.
MOUSEEVENTF_RIGHTDOWN
Specifies that the right button changed to down.
MOUSEEVENTF_RIGHTUP
Specifies that the right button changed to up.
MOUSEEVENTF_MIDDLEDOWN
Specifies that the middle button changed to down.
MOUSEEVENTF_MIDDLEUP
Specifies that the middle button changed to up.
MOUSEEVENTF_WHEEL
Windows NT only: Specifies that the wheel has been moved, if the mouse has a wheel. The amount of movement is given in dwData

The flag bits that specify mouse button status are set to indicate changes in status, not ongoing conditions. For example, if the left mouse button is pressed and held down, MOUSEEVENTF_LEFTDOWN is set when the left button is first pressed, but not for subsequent motions. Similarly, MOUSEEVENTF_LEFTUP is set only when the button is first released.

· dx
Specifies the mouse’s absolute position along the x-axis or its amount of motion since the last mouse event was generated, depending on the setting of MOUSEEVENTF_ABSOLUTE. Absolute data is given as the mouse’s actual x-coordinate; relative data is given as the number of mickeys moved. A mickey is the amount that a mouse has to move for it to report that it has moved.

· dy
Specifies the mouse’s absolute position along the y-axis or its amount of motion since the last mouse event was generated, depending on the setting of MOUSEEVENTF_ABSOLUTE. Absolute data is given as the mouse’s actual y-coordinate; relative data is given as the number of mickeys moved.

· dwData
If dwFlags is MOUSEEVENTF_WHEEL, then dwData specifies the amount of wheel movement. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120.
If dwFlags is not MOUSEEVENTF_WHEEL, then dwData should be zero.

· dwExtraInfo
Specifies an additional 32-bit value associated with the mouse event. An application calls GetMessageExtraInfo to obtain this extra information.

Надеюсь, поможет :wink:
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.05.2004 (Вс) 13:31

Борис писал(а): К сожалению, в доступных мне источниках не удалось найти описание этой функции, а также передаваемых ей параметров.
Источники должны быть хорошими! :wink:
Нет меня больше

Борис
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 22.05.2004 (Сб) 12:54

Сообщение Борис » 24.05.2004 (Пн) 17:58

Tarik писал(а):Надеюсь, поможет :wink:


Конечно поможет. попробовал применить эту Sub - она работает, но только в том случае, если предварительно в нужную позицию установить курсор мыши (программно задать координаты через другую API). Если этого не сделать, то клик не срабатывает, даже при том, что вызывая Sub я передаю в нее координаты.

Но я сразу не сообразил, что это Sub. А раз так, то она не возвращает параметров. А у меня нарисовалась еще одна проблема - как перехватить клик вне своей программы?

Иными словами, я перемещаю мышь и одновременно отслеживаю ее координаты. Но в какой-то момент мне нужно прекратить отслеживание координат, например, сделав клик. А вот как распознать - был ли этот клик сделан, или еще нет?

Помогите!!! Век не забуду!!!
Заранее благодарю!
До встречи на форуме!

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 24.05.2004 (Пн) 19:25

Не знаю... :( Пытался через хук, VB вылетел с визгом... :(
Может у вас получится? Попробуйте SetWindowsHookEx с константой WH_MOUSE и все в этом роде...
Последний раз редактировалось A.A.Z. 25.05.2004 (Вт) 11:13, всего редактировалось 1 раз.
Нет меня больше

Борис
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 22.05.2004 (Сб) 12:54

Сообщение Борис » 24.05.2004 (Пн) 19:44

A.A.Z. писал(а):Источники должны быть хорошими! :wink:


В интернете рылся на многих сайтах, :roll: в том числе и с некоторыми оттуда работал. Но иногда доступ к информации не получался (например, возникали ошибки "неожиданный конец архива"), а в других - того, что надо, небыло. :(
До встречи на форуме!

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 25.05.2004 (Вт) 11:12

Не, с отслеживанием - это, я думаю, точно через хук надо делать... :(
GSerg, где ты?? :o
Нет меня больше

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.05.2004 (Вт) 14:45

:shock:
:roll:
Да я тут, в общем-то :roll:
Просто я уже устал говорить, что глобальный хук требует размещения callback в native dll, забейте на это дело...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.05.2004 (Вт) 15:13

GSerg, так ведь ты шаман :) В тебя все верят :))
Вот сейчас придет добрый дядя GSerg и наколдует :)
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.05.2004 (Ср) 8:38

Неее, колдовать компилятор dll я не буду, у меня на это delphi есть :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Борис
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 22.05.2004 (Сб) 12:54

Сообщение Борис » 28.05.2004 (Пт) 18:12

GSerg писал(а):Неее, колдовать компилятор dll я не буду, у меня на это delphi есть :)


Прошу прощения, но я что-то не понял - про что речь?
Ведь если Windows отслеживает клики, значит он как-то это делает! Ведь если я могу определить координаты мыши и послать по ним клик (спасибо за помошь с mouse_event!), то почему не могу и перехватить такой клик или некое системное сообщение о нем?! Ведь, повторюсь, Windows это делает, когда, например, открывает какую-либо папку (директорию). Мне же, в сущности, нужно сделать то же самое. Вот только как - я пока не знаю.

Может, кто-то знает и подскажет?

Спасибо всем, кто пытается мне помочь и заранее благодарен тем, кто то сможет помочь!
До встречи на форуме!

SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Сообщение SeRRg » 28.05.2004 (Пт) 19:44

Ну-ну-ну... Ты С с VB не путай.
Теоретически (и практически) в Виндовсе 98 можно поставить глобальный хук на мышу и клаву за счет какого-то там глюка.
(если ошибся - Шаман поправит :) )
Но в других это не прокатывает. А так, как сказал GSerg, требуется отдельная native dll'ка,
которую VB сделать ну никак не может. Пиши ее на другом языке.
Понятно объяснил???
VB - это звучит!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.05.2004 (Сб) 8:53

В общем, это :)

Винда-то все клики видит. Видит она их потому, что ей драйвер мыши в system message queue постит сообщения. Винда зырит, какое окно расположено в данной точке и перемещает данное сообщение из system message queue в thread message queue данного окна. Окно получает сообщение через GetMessage и делает выводы, что его кликнули...

Всё это объясняет, почему ты не видишь кликов вне твоего окна - винда просто постит их не в твою message queue. А координаты с queue не связаны, поэтому ты их завсегда...

Так вот... Залезать в system message queue нехорошо... И ставить глобальный хук тоже нехорошо. В msdn чётко сказано: не юзайте, челы, глобальные хуки, кроме как для дебага, а из релиза убирайте, ибо по систем перфомансу оные бьют со страшной силой...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 29.05.2004 (Сб) 22:00

Так как человеку проблему-то решить? :roll:
Нет меня больше

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.05.2004 (Вс) 12:10

Вот всегда я крайний...

Ладно, идите в Проекты :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 30.05.2004 (Вс) 14:10

Были там уже :arrow: :(
Нет меня больше

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.05.2004 (Пн) 9:13

Так ещё раз :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 31.05.2004 (Пн) 17:55

И что?
Нет меня больше

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.06.2004 (Вт) 4:30

Хватит тут флудить :)
Переходим на общение в Проектах :) Хотя афтар топика не появляется, но, может, что-то полезное извлечём :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 5

    TopList  
cron