| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Эмуляция нажатия кнопки мыши |
| Автор: Гость_Aaz 30.12.2005, 12:42 |
| Мне нужно эмуляция нажатия кнопки мышы в определенном окне. Мой код: HWND wnd1 = FindWindow(NULL,"XXX"); //PostMessage(wnd1, WM_KEYDOWN, VK_F1, 0); //Проверял правильно ли найдено окно. Все ок Кнопка Ф1 срабатывала // Пробовал так ничего возвращает true- в очередь ставит // PostMessage(wnd1, WM_LBUTTONDOWN, 0, MAKELPARAM(300,300)); // PostMessage(wnd1, WM_LBUTTONUP, 0, MAKELPARAM(300,300)); // Так Ничего тоже самое // PostMessage(wnd1, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(300,300)); // PostMessage(wnd1, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(300,300)); //Попробовал напрямую без очереди Выдает false bool y = SendMessage(wnd1, WM_LBUTTONDOWN, 0, 300*65536+300); bool yy = SendMessage(wnd1, WM_LBUTTONUP, 0, MAKELPARAM(300,300)); Помогите плиззз..я уже незнаю что придумать или что я упустил. Может кто подскажет др реализацию эмуляции мыши не через PostMessage заранее спасибо |
| Автор: _hunter 30.12.2005, 12:58 |
| а ты уверен что мышой нажать нужно в окне а не на какой-нить кнопке? |
| Автор: Гость_Aaz 30.12.2005, 13:17 |
| В часности мне надо нажимать кнопки в флешь обекте, на веб странице. Вполне возможно что придеться не только кнопки но и просто нажатие в отдельную точку. Поэтому и пытаюсь сразу с мышкой разобраться...А не конкретизироваться на отдельных кнопках. Но если нечего не получиться то придеться и кнопкоми заняться...Тока как определить индификатор Флешь кнопки в Флешь обекте??? |
| Автор: Romikgy 30.12.2005, 13:36 | ||
Мож не попадаешь по кнопке??? |
| Автор: Гость_Aaz 30.12.2005, 13:49 |
| Вставлял строчку SetCursorPos(300,300); И разворачивал окно на весь экран что бы небыло делем с относительными координатами экрана и окна. Так же на простом приложении AkelPad пробовал эмуляции нажатия правой кнопки. Должно было вылезни меню, по всей поверхности приложения. Ничего те же результаты. при SendMessage выдает false |
| Автор: _hunter 30.12.2005, 13:50 |
| нарисуй тестовое приложение ( с одной кнопкой и попробуй ему таким образом послать сообщения ) + координаты тым не абсолютные а оконные |
| Автор: _hunter 30.12.2005, 14:02 | ||||||
| тут дело, скорее всего, в адресате потому как в тестовом приложении такой:
код работает, а такой
уже нет... Добавлено @ 14:08 + вот что spy++ показывает:
последние два -- уже реакция кнопки. попробуй такой же набор послать |
| Автор: Гость_Aaz 30.12.2005, 14:15 | ||
| Создал форму. С одной большой кнопкой и текст полем для отоброжения результата. Координаты относительно окна. Навсякий случай подвинул форму в левый верзний угол. код
непомогает...ничего.... Уже Пробовал перестовлять PostMessage(wnd1, WM_LBUTTONDOWN, MAKELPARAM(100,100),0); параметры....Уже крыша едет Может ещо у кого есть соображения. |
| Автор: Aleksandor 30.12.2005, 14:21 |
| А пробовал SetFocus(wnd1) перед тем как слать ему сообщения? Попробуй вставить Beep(3000,200); чтобы узнать получает ли окно твои сообщения. |
| Автор: _hunter 30.12.2005, 14:49 |
| я ж говорю. сообщения идут адресату, а он ( адресат ) не пытается определить есть ли у него дети по заданным координатам. |
| Автор: Гость_Aaz 30.12.2005, 15:17 | ||
| to hunter : Я ещо только учусь поправь где я непонял пожалуйста. --Spy++ Перехватывает сообщения окну. R ответ окна S SendMessage P PostMessage И поручаеться нужно послать окну (по твоему коду):
Или я тебя неправильно понял???? Потому что при этом коде тоже ничего непроисходит. |
| Автор: Aleksandor 30.12.2005, 15:18 | ||
А если так
|
| Автор: _hunter 30.12.2005, 15:40 |
| Гость_Aaz, по-идее -- так. ( хотя с флешем может и не сработать -- лучше spy' ем посмотри такие же ему сообщения идут или нет ) Aleksandor, посылать нужно не нормальному окну, а во флеш |
| Автор: Гость_Aaz 30.12.2005, 15:43 | ||
| to Alexsandor: О гуру РАБОТАЕТ Оканчательный вариант
Мдя......Я бы долго соображал.... |
| Автор: Гость_Aaz 30.12.2005, 15:44 |
| огромное спасибо всем кто неполенился подумать над моей проблемой. |
| Автор: Earnest 30.12.2005, 17:02 | ||
Для эмуляции мыши лучше использовать функции mouse_event или SendInput.
Преимущества: нет привязки к окну. Событие обрабатывается системой абсолютно так же, как если бы пользователь действительно ткнул мышем. И попадает в очередь ввода правильного окна автоматически. |
| Автор: GremlinProg 5.1.2006, 21:51 |
| Почти не читал комментарии, но сразу вижу правильное решение Earnest |
| Автор: KQT 3.2.2010, 14:02 |
| Earnest, благодярю за наводку: mouse_event и SendInput, но всё же... Гость_Aaz, действительно ли окончательный вариант "такой"? SendMessage отправляет сообщение обработчику окна и ждёт(!) обработки. Тот видимо не завершает работы пока клавиша мыши не будет отжата, то есть второй Send уже не играет ни какой роли: программа повисает на первом в ожидании WM_LBUTTUNUP. Все получается если например использовать SendMessageCallback... |
| Автор: KQT 3.2.2010, 16:45 | ||
... Не помещает - хотим напрямую обратиться к обработчику окна. Но
В переписав код приведенный выше моя программа стоорилась на первом sendmessage в ожидании отжатия клавиши мыши, иначе говоря управление было передано процедуре окна первым sendmessage, а она по какой то причине не желает завершатсья пока кнопка не будет отжата... В итоге второй sendmessage выполняется "впустую", когда в этом необходимости уже нет. Решается это PostMessage или SendMessageCallback . Тема то старая, но мне нынче актуальна) и оказалась чем-то полезна. |
| Автор: walkmn 30.10.2010, 16:18 | ||
У меня работает только если в данных координатах кнопка, а мне нужно чтобы нажималась в определенных координатах компонента СppWebBrowser. Ну например есть форма с компонентов СppWebBrowser в котором загружен гугл, и мне нужно клацнуть по определенной ссылке, но сетмоусепоз не предлагать, кликать по ссылке программа должна в свернутом режиме!!! |
| Автор: Romikgy 31.10.2010, 23:26 |
это не проканает ... имхо нужно парсить страницу на наличие ссылок и переходить на урл.... |
| Автор: walkmn 31.10.2010, 23:46 |
| Romikgy, да нет, просто я это как в пример привел, на самом деле нужно нажать на кнопку, которая написана на Flash. Тоесть это флеш игрушка, нужно написать для нее чтото типа автобота. |
| Автор: Romikgy 11.11.2010, 22:17 |
| walkmn, тогда попутно разобратся с флешем ... видать там есть типа мессаг при нажатии на кнопки ... вот их можно слать (я так думаю) иначе только активировать окно и по координатам кнопать ... |