Клик мышой

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

Клик мышой

Сообщение Fedorfx » 21.03.2005 (Пн) 17:27

Угу - вижу что некоторые поморщились от названия топика.
Видит бог я пересмотрел все топики где есть Mouse_event
короче траблса.
Internet explorer
в нем Macromedia flassh аплет
окон как таковых там нет
нашел опытным путем координаты и хочу нажать на кнопочку.
Код: Выделить всё
SetForegroundWindow(hWND)
                ret = ClientToScreen(CType(hWND, IntPtr), po)
                x = po.x + 270 : y = po.y + 170
                ret1 = SetCursorPos(x, y)
                mouse_event(6, x, y, 1, 0)

не проходит
Код: Выделить всё
SetForegroundWindow(hWND)
                ret = ClientToScreen(CType(hWND, IntPtr), po)
                x = po.x + 270 : y = po.y + 170
                ret1 = SetCursorPos(x, y)
                mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 1, 0)
                mouse_event(MOUSEEVENTF_LEFTUP, x, y, 1, 0)

тоже не проходит
курсор встает на нужное место но вот кнопка не нажимается.
хотя иногда проходит а иногда нет
Какие мысли??

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

Сообщение GSerg » 21.03.2005 (Пн) 18:36

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

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 21.03.2005 (Пн) 19:04

ок попробую
Но вот вопрос
Эти все
Mouse_event
Send Input
я так понимаю асинхронные а
SendMessage
выполниться немедленно???
так или нет??
и если так то можно ли выполнить клик мышой в чужом оне через send message??? чтобы клик выполнился немедленно а не через 100-300 мсек :-((

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.03.2005 (Вт) 13:33

Можно. Эдинственно только тебе нужно для начала найти hWnd окна, которому ты будешь посылать мессагу. В данном случае, как я понимаю, это будет окно эксплорера, или одно из его дочерних окон. Ну а потом уж лепишь из координат lParam, wParam оставляешь пустым и вперед! Правда вот мгновенность выполнения не факт...
То, что для одних константа, для других только переменная...

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 29.03.2005 (Вт) 14:20

GSerg писал(а):Поюзать великую и ужасную функцию SendInput? :)


Чтобы поюзать эту функцию нужно поюзать CopyMemory
Что у меня в Net не получается
Второй час хожу по буржуйским форумам но что то наверное не то ищу.
Marshal.Copy тоже не принимает нужные мне параметры( но скорее всего руки кривые)
И к тому же. Я так понимаю что SendInput это обертка для Mouse_Event and Keyb_Event???
И на засыпку. SendInput по документации шлет PostMessage
Как послать мессадж и ЗАСТАВИТЬ обработать все события в очереди сообщений?

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

Сообщение GSerg » 29.03.2005 (Вт) 14:47

  1. Ничего не знаю про CopyMemory применительно сюда :)
  2. Аааа, дык почему же ты не в форум по .NET постишь? :)
  3. Маршалинг - вещь особо злостная, после того, как в ней разберёшься :)
  4. Чё-то не вижу описания того, что SendInput суть обёртка :)
  5. ЗАСТАВИТЬ обработать сообщения в очереди НЕЛЬЗЯ :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 29.03.2005 (Вт) 15:31

GSerg писал(а):
  1. Ничего не знаю про CopyMemory применительно сюда :)
  2. Аааа, дык почему же ты не в форум по .NET постишь? :)
  3. Маршалинг - вещь особо злостная, после того, как в ней разберёшься :)
  4. Чё-то не вижу описания того, что SendInput суть обёртка :)
  5. ЗАСТАВИТЬ обработать сообщения в очереди НЕЛЬЗЯ :)


:-)
Я прям чуть не застрелился.
Я перерыл весь форум по поиску SendInput. Как правило его упоминал ты но ни одного примера нетутиэ
Нашел только вот этот пример.
Код: Выделить всё
    Dim GInput(0 To 0) As GENERALINPUT
    Dim KInput As MOUSEINPUT
    KInput.dwFlags = MOUSEEVENTF_LEFTDOWN
    GInput(0).dwType = INPUT_MOUSE
    CopyMemory GInput(0).xi(0), KInput, Len(KInput)
    Call SendInput(1, GInput(0), Len(GInput(0)))

Во всех примерах этот код или его клон, но везде есть копирование структуры через CopyMemory. Если можно иначе то плз код в студию ( токо без ассемблерных вставок и ручного заполнения массива байтов) :-)
[*]Аааа, дык почему же ты не в форум по .NET постишь? :)
Так чего клонов плодить. Про нажатие мыши и так раз в неделю.

[*]Чё-то не вижу описания того, что SendInput суть обёртка :)
Это я предположил - т.к. гдето есть упоминание что начиная с 2000 виндов микрософт рекомендует использовать SendInput вместо Mouse_event - вот я и подумал что меняю шило на мыло.

[*]ЗАСТАВИТЬ обработать сообщения в очереди НЕЛЬЗЯ :)
У меня вот такая бяка



Код: Выделить всё
poz1 = GetCursorPos(po2)
                ret = ClientToScreen(CType(hWND, IntPtr), po)
                x = po.x + 214 : y = po.y + 79
                ret1 = SetCursorPos(x, y)
                mouse_event(6, x, y, 0, 0)
SetCursorPosition(poz1)

Так вот траблса в том что если я вставляю SetCursorPosition(poz1)
то кнопка не нажимается. Дя и вообще при этом коде кнопка нажимается не в 100 процентах а как сама захочет. Я фигею уже вторую неделю. такое впечатление что обработка нажатия идет с задержкой и позиция курсора берется не в момент нажатия а в момент обработки события.
Неед хелп.

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

Сообщение GSerg » 29.03.2005 (Вт) 15:52

Ыыыы.... ээээ.... гм....

Во-первых, вообще нафига setcursorpos? :)
Во-вторых, вот это вот прочитай: :)
MSDN писал(а):If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface, (65535,65535) maps onto the lower-right corner.

If the MOUSEEVENTF_ABSOLUTE value is not specified, dx and dy specify relative motions from when the last mouse event was generated (the last reported position). Positive values mean the mouse moved right (or down); negative values mean the mouse moved left (or up).

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

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

Сообщение GSerg » 29.03.2005 (Вт) 15:55

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

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 29.03.2005 (Вт) 17:37

GSerg писал(а):Ыыыы.... ээээ.... гм....

Во-первых, вообще нафига setcursorpos? :)

Была причина - setcursorposition легче подвести.Хотя теперь не уверен.

Во-вторых, вот это вот прочитай: :)
В-третьих, сначала вызывай mouse_event ы LEFTDOWN, а потом ещё раз с LEFTUP :)[/quote]

Прочитал - заморочек с позиционированием курсора у меня не было - все проверялось и курсор стоял там где надо.

В тратьих - Ты и вправду шаман. Пока все работает но на все тесты уйдет вечер.
P.S. Только вот непонятно почему сначала послал к SendInput a тут шаманим с MouseEvent???

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

Сообщение GSerg » 30.03.2005 (Ср) 4:58

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

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 31.03.2005 (Чт) 0:06

боюсь сглазить но пока все работает.
Думаю траблса была из за связки setcursorposition and mouse_event
при переводе кода только на mouse_event все стало стабильнее работать. Меня эти Virtual Mashine задолбали порядком уже.
Спасибо за наставление на путь истинный :-)

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 19.04.2005 (Вт) 14:47

Вопрос
Все нормально работает если монитор 1
Но вот у меня на одной машине 2 монитора а на другой три.
При этом на некоторых мониторах разные разрешения.
Как получить координаты точки для mouse_event MOUSEEVENTF_ABSOLUTE ?
а то сейчас выходит огород с переводом окна в эти координаты - может есть апишка какая либо или еще кой чего???


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

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

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

    TopList