информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на InternetГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
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.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach