Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > SendMessage есть, но клик не по кнопке


Автор: NewbieNoob 30.10.2011, 13:20
Код

  px:=Form1.Left+StrToInt(edtx.Text)+form1.Width-form1.ClientWidth;
  py:=Form1.top+StrToInt(edty.Text)+form1.Height-form1.ClientHeight;
  dw:=MakeLParam(px,py);
  h:=FindWindow(nil,'Form1');
  SendMessage(h,WM_LBUTTONDOWN, MK_LBUTTON,dw);
  SendMessage(h,WM_LBUTTONUP,MK_LBUTTON,dw);

Происходит событие клика по форме, а не по кнопке(а еит вводятся координаты кнопки), фокус на кнопку не переносится.
При этом я ловил OnMouseDown и Up на форме, координаты совпадали с передаваемыми, переносил курсор на координаты клика - он вставал над кнопкой, руками тыкал клик, кнопка срабатывала, в чем может быть ошибка?

Автор: jhonyxakep 30.10.2011, 13:53
Цитата(NewbieNoob @  30.10.2011,  13:20 Найти цитируемый пост)
h:=FindWindow(nil,'Form1');


Вы ведь явно тут нашли хендл окна, а не кнопки.

Автор: NewbieNoob 30.10.2011, 14:03
мм, ну по идее, клик должен быть в окне, но не по самому окну, а по элементу. Когда программа будет готова, хэндл элемента получить не получится, надо отправлять сообщение о клике в окно, как будто пользователь кликнул.
h:=FindWindow(nil,'prog') - пробовал получать хэндл приложения, но тоже не получается

Автор: bems 30.10.2011, 15:13
NewbieNoob, твоя кнопка тоже окно. у неё свой хендл. это значит отправляй сообщение кнопке а не форме. что не понятно?

Автор: NewbieNoob 30.10.2011, 15:24
А все прочитать сложно? Не будет потом хэндла кнопки, это сейчас, для тестов... Если через sendmessage вобще не получится, так и скажите.

Автор: bems 30.10.2011, 15:29
NewbieNoob, разговаривай ровнее.
Если кнопка останется кнопкой (TButton), то хендл у неё будет. Найти его можно например с помощью ChildWindowFromPoint.
Не будет хендла только в случае если кнопка не наследуется от TWinControl (например TSpeedButton)

Автор: NewbieNoob 30.10.2011, 17:07
Извиняюсь.
А еще хэндла не будет если программа рассчитана на универсальную работу с любым приложением. Проблема именно в том, что нужно эмулировать клик только по координатам.
Скорее всего, этими средствами так сделать не получится, но, наверное, можно на более низком уровне добиться желаемого?

Автор: northener 30.10.2011, 23:42
Цитата(NewbieNoob @  30.10.2011,  17:07 Найти цитируемый пост)
А еще хэндла не будет если программа рассчитана на универсальную работу с любым приложением. Проблема именно в том, что нужно эмулировать клик только по координатам.

Если не будет хэндла, то по "чему" кликать-то будем?
Если приложение "оконное", то хэндл будет обязательно, куда ж без него? А если не оконное, то при чём тут SendMessage?
Так что "универсальная работа с любым приложением" - это, имхо, фантастика.

Цитата(NewbieNoob @  30.10.2011,  17:07 Найти цитируемый пост)
наверное, можно на более низком уровне добиться желаемого

Наверно можно. Подменив драйвер мыши. Но вот нужно ли? 

Автор: bems 31.10.2011, 00:08
Цитата(NewbieNoob @  30.10.2011,  17:07 Найти цитируемый пост)
Проблема именно в том, что нужно эмулировать клик только по координатам.
ChildWindowFromPoint пока не закончатся уровни вложенности окон тебя спасёт

Автор: northener 31.10.2011, 00:25
Цитата(bems @  31.10.2011,  00:08 Найти цитируемый пост)
ChildWindowFromPoint пока не закончатся уровни вложенности окон тебя спасёт

Он хочет работать без хэндлов! Ну т.е. никаких!
Значит и окон не предвидится. О чём тогда мы говорим, и что ему советовать? 
Он хочет "кликать по координатам". Ну так бог ему в помощь, если учебники он не читал.

Автор: bems 31.10.2011, 00:36
Цитата(northener @  31.10.2011,  00:25 Найти цитируемый пост)
О чём тогда мы говорим, и что ему советовать? 
Он хочет "кликать по координатам"

тогда мы советуем использовать SendInput и просим выложить видеозапись попыток реализации smile

Автор: northener 31.10.2011, 00:39
Цитата(bems @  31.10.2011,  00:36 Найти цитируемый пост)
и просим выложить видеозапись попыток реализации 

Вот насчёт видеозаписи, это ты хорошо сказал. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)