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





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




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


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