Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.10.2014, 19:22
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию Send (post) message

День добрый, требуется ваша помощь. Требуется послать клик на кнопку, но его нет. В чем проблема? Хендл находит верный
Код:
procedure TForm1.Button1Click(Sender: TObject);
var

  h: HWND;
begin

  h := FindWindow(nil,'Текст' );
  
  h := FindWindowEx(h, 0, 'ButtonClass', nil);
 ShowMessage(IntToStr(h));
  PostMessage(h, BM_CLICK,0,0);
end;
BM_CLICK Менял на аналоги, но нет реакции.
Ответить с цитированием
  #2  
Старый 26.10.2014, 23:55
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Судя по названию класса 'ButtonClass', это что-то от Мелкомягких. И заметьте, на BM_CLICK обязан реагировать класс 'BUTTON'. Про 'ButtonClass' это с уверенностью сказать нельзя. Можно попытаться послать WM_LBUTTONDOWN, WM_LBUTTONUP.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
nixon232 (27.10.2014)
  #3  
Старый 27.10.2014, 01:40
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от angvelem
...Можно попытаться послать WM_LBUTTONDOWN, WM_LBUTTONUP.
и правда, шлёт
Код:
...
h:= FindWindowEx(FindWindow(nil, 'Текст'), 0, nil, 'Надпись на кнопке');
PostMessage(h, WM_LButtonDown, 1, 1);
PostMessage(h, WM_LButtonUP, 1, 1);
...
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
nixon232 (27.10.2014)
  #4  
Старый 27.10.2014, 11:02
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от angvelem
Судя по названию класса 'ButtonClass', это что-то от Мелкомягких. И заметьте, на BM_CLICK обязан реагировать класс 'BUTTON'. Про 'ButtonClass' это с уверенностью сказать нельзя. Можно попытаться послать WM_LBUTTONDOWN, WM_LBUTTONUP.
Ваша правда, контрол тут непонятный и как по нему нажать я не знаю. Код выше не работает. Какие есть еще варианты?
Ответить с цитированием
  #5  
Старый 27.10.2014, 18:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от nixon232
Какие есть еще варианты?
mouse_event() 2 раза
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 27.10.2014, 22:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от nixon232
...Код выше не работает...
Я делал так: создал два проекта, первый - форма и кнопка, при жиме на которую что-то отображается в лейбле, второй - тоже самое, а в обработке кнопки запускал этот код с параметрами FindWindowEx(FindWindow(nil, 'Form1'), 0, nil, 'Button1'): оно работает, причём и Post... и SendMessage(), здесь претензий нет, значит вам всё же нужно определиться, что представляет из себя то, что вы хотите нажать, именно здесь собака порылась, однозначно
Ответить с цитированием
  #7  
Старый 07.11.2014, 16:41
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

так я че-то с кликами и не понял, смог добиться клика только с физическим перемещением мыши
Код:
    SetCursorPos( pt.X, pt.Y );
        Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LeftDOWN, 0, 0, 0, 0 );

        Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
А тот же код с координатами не берет..
Код:
  Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LeftDOWN, pt.X, pt.Y, 0, 0 );

        Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, pt.X, pt.Y, 0, 0 );
Что может быть то?
Ответить с цитированием
  #8  
Старый 08.11.2014, 04:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Mouse_event отрабатывает относительные координаты, поэтому предварительно ставить курсор куда надо посредством SetCursorPos() обязательно. Его можно сначало запомнить через GetCursorPos(), обработать клик, а потом вернуть обратно координаты указателя. Или тогда попробовать сделать так
Код:
...
// Вгоняем в поинт точку жима
pt.X := 300;
pt.Y := 300;

// Преобразуем её к координатам на экране 
pt := ClientToScreen(pt); 

// 65535 - это ширина экрана
pt.X := Round(pt.X * (65535 / Screen.Width)); 
pt.Y := Round(pt.Y * (65535 / Screen.Height)); 

// И лишь затем сам жим
Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LeftDOWN, pt.X, pt.Y, 0, 0 );

        Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, pt.X, pt.Y, 0, 0 );
drkb:01582
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
nixon232 (08.11.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter