Люди, подскажите как можно программно имитировать
такое действие : как будто пользователь установил курсор мыши
в заданную позицию (х , у) и сделал двойной щелчок левой кнопкой
мыши?
Visual C++; Имитация действий пользователя.24.12.01 15:16 Автор: ih8u <i hate you> Статус: Member
Легко!
перемещаем мышь:
SetCursorPos(int x, int y);
Кликаем:
1) Нужно получить HWND того, на что кликать,
потом посылаем мессагу WM_LBUTTONDOWN этому окну
вот и всё!
Можно ещё попарици и посылать мессаги WM_MOUSEWHEEL
> Легко! > перемещаем мышь: > SetCursorPos(int x, int y); > > Кликаем: > 1) Нужно получить HWND того, на что кликать, > потом посылаем мессагу WM_LBUTTONDOWN этому окну > вот и всё! > Можно ещё попарици и посылать мессаги WM_MOUSEWHEEL
Попробовал так сделать. Курсор мыши устанавливается, HWND
определяется, но почему-то это окно не реагирует на посланное сообщение. Может быть нужно установить фокус на это окно или это по другой причине ?
Visual C++; Имитация действий пользователя.25.12.01 10:02 Автор: ih8u <i hate you> Статус: Member
Вобще, любые действия юзера - шевеление мышкой, кликанье и др. это есть посылание сообщений программе, конкретно - окну, тоесть зная HWND окна программно можно всё делать,
возможно, в твоём случае нужно установить фокус - ::SetFocus(HWND)
Visual C++; Имитация действий пользователя.25.12.01 10:18 Автор: ih8u <i hate you> Статус: Member
Щас сам попробывал с кнопкой ПУСК, нашол её HWND, а потом послал ::SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0);
Она нажалась!!
на щот установки фокуса я выше напиздил чутьчуть - нужно тоже посыласть сообщение - ::SendMessage(hwnd, WM_SETFOCUS, 0, 0);
Что касается движения мышкой, то вероятно в сообщение в два последних параметра WPARAM и LPARAM передаюца мышиные координаты
[C++] Visual C++; есть еще ф-ия mouse_event()25.12.01 13:56 Автор: 1blin Статус: Незарегистрированный пользователь
Делать SendMessage(WM_LBUTTONDOWN,...) - не самый лучший вариант, тем более без последующего WM_LBUTTONUP. Можно повесить приложение или всю систему.
Более безопасный способ: PostMessage и WaitForInputIdle.
Например,
long l = x | (y<<16);
post_and_wait(WM_LBUTTONDOWN,0,l);
... /* действия после клика, но до отпускания */
post_and_wait(WM_LBUTTONUP,0,l);
... /* действия после отпускания */
> ну можно посылать подряд > SendMessage(WM_LBUTTONDOWN,....); > SendMessage(WM_LBUTTONUP,...); > > И вообще, у меня ничо не висло, когда я этим занимался, > и вообще я показал общий принцип, а не работающий код без > глюков
Как раз этот "общий принцип" не совсем корректен. Пользовательские сообщения посылаются через PostMessage, через PostMessage их и надо эмулировать. SendMessage в большинстве случаев тоже будет работать, но это потенциально опасная операция - посылающий поток блокируется до завершения функции, и я не берусь предсказывать результат, если в процессе обработки этого сообщения будет создан SYSMODAL диалог или начнется генерация перерисовок/каких-нибудь других сообщений во все окна подряд. Опять же, есть вероятность потери фокуса окном-обработчиком сообщения в промежуток между SetFocus и SendMessage(WM_LBUTTONDOWN...).
Резюме: для нормальной программы (например, на продажу) подобную рассылку кликов лучше делать через PostMessage.
если бы SendMessage всегда срабатывал, стал бы я выдумывать сложный способ...26.12.01 21:34 Автор: ih8u <i hate you> Статус: Member
Почему-то, если например висит проводник на экране и послать
сообщение WM_LBUTTONDOWN для кнопки в его правом верхнем углу
(для кнопки закрытия программы), то она не нажимается.
Кроме того, почему-то не нажимаются кнопки из панели инструментов
проводника, не выбираются пункты меню. А на рабочем столе все нажимается и кнопка "Пуск" тоже.
Не пойму в чем дело. HWND определяю функцией
::WindowFromPoint( pt ); Пробовал посылать сообщения и через SendMessage, и через PostMessage, и через SendNotifyMessage.
Не получается. Помогите советом плиз.
Однако, не все получилось :(28.12.01 12:03 Автор: ih8u <i hate you> Статус: Member
> А помоему получить HWND у кнопок в правом верхнем углу > нихрена нельзя Ты прав, с помощью WindowFromPoint нельзя получить HWND кнопок
в правом верхнем углу (можно получить только HWND их родительского окна).
Но как нажатия на них и на кнопки панели инструментов обрабатывает система - я ни фига не пойму. Сейчас пробовал использовать mouse_event() - с ней все получается. Но как это самому смоделировать?
Однако, не все получилось :(29.12.01 14:45 Автор: ih8u <i hate you> Статус: Member
Кнопки Minimize/Resotre/Close - это не окна, и HWND у них соответственно нет.
В неклиентскую часть окна в лучшем случае надо посылать WM_NCLBUTTONDOWN.
По-моему, система при нажатии на кнопку закрытия должна сгенерировать именно WM_NCLBUTTONDOWN, потом будет вызов WM_NCHITTEST, потом WM_SYSCOMMAND, и в конце WM_CLOSE.