Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | | | | | | | | | | |
Однако, не все получилось :( 29.12.01 14:45 Число просмотров: 1283
Автор: ih8u <i hate you> Статус: Member
|
А нахрен ваще нажимать те кнопки закрыть???
не проще послать мессагу главному окну WM_QUIT или WM_CLOSE
|
<programming>
|
Visual C++; Имитация действий пользователя. 24.12.01 14:53
Автор: Tolmut Статус: Незарегистрированный пользователь
|
Люди, подскажите как можно программно имитировать
такое действие : как будто пользователь установил курсор мыши
в заданную позицию (х , у) и сделал двойной щелчок левой кнопкой
мыши?
|
|
Visual C++; Имитация действий пользователя. 24.12.01 15:16
Автор: ih8u <i hate you> Статус: Member
|
Легко!
перемещаем мышь:
SetCursorPos(int x, int y);
Кликаем:
1) Нужно получить HWND того, на что кликать,
потом посылаем мессагу WM_LBUTTONDOWN этому окну
вот и всё!
Можно ещё попарици и посылать мессаги WM_MOUSEWHEEL
|
| |
Visual C++; Имитация действий пользователя. 25.12.01 07:46
Автор: Tolmut Статус: Незарегистрированный пользователь
|
> Легко! > перемещаем мышь: > 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 Статус: Незарегистрированный пользователь
|
|
| | | | | |
Спасибо всем. Все получилось. 25.12.01 15:25
Автор: Tolmut Статус: Незарегистрированный пользователь
|
|
| | | | | | |
и еще совет на будущее 25.12.01 15:59
Автор: ukv Статус: Незарегистрированный пользователь
|
Делать SendMessage(WM_LBUTTONDOWN,...) - не самый лучший вариант, тем более без последующего WM_LBUTTONUP. Можно повесить приложение или всю систему.
Более безопасный способ: PostMessage и WaitForInputIdle.
Например,
HWND hwnd;
DWORD pid;
HANDLE hproc;
...
hwnd = FindWindow(...);
GetWindowThreadProcessId(hwnd,&pid);
hproc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);
....
long l = x | (y<<16);
post_and_wait(WM_LBUTTONDOWN,0,l);
... /* действия после клика, но до отпускания */
post_and_wait(WM_LBUTTONUP,0,l);
... /* действия после отпускания */
void post_and_wait(UINT msg,WPARAM w,LPARAM l)
{
::PostMessage(hwnd,msg,w,l);
::WaitForInputIdle(hproc,INFINITE);
}
|
| | | | | | | |
и еще совет на будущее 26.12.01 10:29
Автор: ih8u <i hate you> Статус: Member
|
ну можно посылать подряд
SendMessage(WM_LBUTTONDOWN,....);
SendMessage(WM_LBUTTONUP,...);
И вообще, у меня ничо не висло, когда я этим занимался,
и вообще я показал общий принцип, а не работающий код без глюков
|
| | | | | | | | |
если бы SendMessage всегда срабатывал, стал бы я выдумывать сложный способ... 26.12.01 14:14
Автор: ukv Статус: Незарегистрированный пользователь
|
> ну можно посылать подряд > 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
|
А чем отличается постмесаге от сендмессаге??????
помоему первое как то запаздывает а второе выполняется сразу
|
| | | | | | | | | | |
slushai "Shurik", ty prezhde chem sporit`, pochital by nemnozhko i po practikovalsia! 26.12.01 21:40
Автор: + <Mikhail> Статус: Elderman
|
|
| | | | | | | | | | | |
Однако, не все получилось :( 28.12.01 08:33
Автор: Tolmut Статус: Незарегистрированный пользователь
|
Почему-то, если например висит проводник на экране и послать
сообщение WM_LBUTTONDOWN для кнопки в его правом верхнем углу
(для кнопки закрытия программы), то она не нажимается.
Кроме того, почему-то не нажимаются кнопки из панели инструментов
проводника, не выбираются пункты меню. А на рабочем столе все нажимается и кнопка "Пуск" тоже.
Не пойму в чем дело. HWND определяю функцией
::WindowFromPoint( pt ); Пробовал посылать сообщения и через SendMessage, и через PostMessage, и через SendNotifyMessage.
Не получается. Помогите советом плиз.
|
| | | | | | | | | | | | |
Однако, не все получилось :( 28.12.01 12:03
Автор: ih8u <i hate you> Статус: Member
|
А помоему получить HWND у кнопок в правом верхнем углу нихрена нельзя
|
| | | | | | | | | | | | | |
Однако, не все получилось :( 28.12.01 13:18
Автор: Tolmut Статус: Незарегистрированный пользователь
|
> А помоему получить HWND у кнопок в правом верхнем углу > нихрена нельзя Ты прав, с помощью WindowFromPoint нельзя получить HWND кнопок
в правом верхнем углу (можно получить только HWND их родительского окна).
Но как нажатия на них и на кнопки панели инструментов обрабатывает система - я ни фига не пойму. Сейчас пробовал использовать mouse_event() - с ней все получается. Но как это самому смоделировать?
|
| | | | | | | | | | | | | | |
Однако, не все получилось :( 29.12.01 14:45
Автор: ih8u <i hate you> Статус: Member
|
А нахрен ваще нажимать те кнопки закрыть???
не проще послать мессагу главному окну WM_QUIT или WM_CLOSE
|
| | | | | | | | | | | | | | |
может, wm_nclbuttondown ? 28.12.01 15:06
Автор: ukv Статус: Незарегистрированный пользователь
|
Кнопки Minimize/Resotre/Close - это не окна, и HWND у них соответственно нет.
В неклиентскую часть окна в лучшем случае надо посылать WM_NCLBUTTONDOWN.
По-моему, система при нажатии на кнопку закрытия должна сгенерировать именно WM_NCLBUTTONDOWN, потом будет вызов WM_NCHITTEST, потом WM_SYSCOMMAND, и в конце WM_CLOSE.
|
|
|