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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.12.2015, 12:43
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию Клик в точку без SetCursorPos

Тогда забил на это, но теперь снова вылезла задача, где двигать мышку просто не вориант. Вот даже тестовый вариант на осеове кода выше, который, в итоге кликает в томесто, где находиться мышка
Код:
 procedure TForm1.Clicking(x,y:Integer);
var
  aPT:TPoint;
  begin
  aPT.X:=x;
  aPT.Y:=y;
   //apt := ClientToScreen(apt);


    apt.X := Round(apt.X * (65535 / Screen.Width));
    apt.Y := Round(apt.Y * (65535 / Screen.Height));
       ShowMessage('x= '+inttostr(apt.X)+'y= '+inttostr(aPT.Y));
    Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTDOWN, apt.X, apt.Y, 0, 0 );
    Sleep(500);
      Mouse_Event( MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTUP, apt.X, apt.Y, 0, 0 );
  end;
Clicking(1077,577)
apt на выходе содержит 36761,33799.
В чем собственно проблема?
если раскрыть
Код:
//apt := ClientToScreen(apt);
, то арт меняется, но кликает всеравно в томесто, где мышь.
Ответить с цитированием
  #2  
Старый 07.12.2015, 14:03
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Двигать однако придётся, без "фокуса" клика не будет, но можно запомнить положение курсора, а после нажима вернуть всё взад, вот проверенный пример из drkb:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Pt, oldPt : TPoint;
begin
Application.ProcessMessages;
Pt.x := Button2.Left + (Button2.Width div 2);
Pt.y := Button2.Top + (Button2.Height div 2);
Pt := ClientToScreen(Pt);
Pt.x := Round(Pt.x * (65535 / Screen.Width));
Pt.y := Round(Pt.y * (65535 / Screen.Height));
GetCursorPos(oldPt);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 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);;
SetCursorPos(oldPt.X, oldPt.Y);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage('Нажалась Button2!');
end;
Ответить с цитированием
  #3  
Старый 07.12.2015, 15:04
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Alegun
Двигать однако придётся, без "фокуса" клика не будет, но можно запомнить положение курсора, а после нажима вернуть всё взад, вот проверенный пример из drkb:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Pt, oldPt : TPoint;
begin
Application.ProcessMessages;
Pt.x := Button2.Left + (Button2.Width div 2);
Pt.y := Button2.Top + (Button2.Height div 2);
Pt := ClientToScreen(Pt);
Pt.x := Round(Pt.x * (65535 / Screen.Width));
Pt.y := Round(Pt.y * (65535 / Screen.Height));
GetCursorPos(oldPt);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 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);;
SetCursorPos(oldPt.X, oldPt.Y);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage('Нажалась Button2!');
end;
Так то все сместилось и кликнуло, но вознгикает вопрос зачем посылать 3 раза координаты клика, ведь оно кликает в мышу? Такой способ плох тем, что если в момент вызова проц-ы работать с мышкой, то гарантировать клик в точку нельзя. Что можно сделать еще?
Ответить с цитированием
  #4  
Старый 07.12.2015, 15:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от nixon232
...но вознгикает вопрос зачем посылать 3 раза координаты клика, ведь оно кликает в мышу? Такой способ плох тем, что если в момент вызова проц-ы работать с мышкой, то гарантировать клик в точку нельзя. Что можно сделать еще?
Да оно думает что "кликает в мышу", проверяет - не находит, и действительно на неё жмёт можно в качестве "защиты от дураков" перед смещением вызвать
ShowCursor(false), а в конце тоже самое, но с true, для гарантии
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
nixon232 (07.12.2015)
  #5  
Старый 07.12.2015, 16:30
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Может вы вообще предложите как решить мою задачу без мышки.
Цель: есть некая кнопка, по клику на которую вызывается Pop-up класса '#32768', там выбрать саб-меню и потом элемент. Если реализовать по клюку то приходиться ставить слипы, чтобы меню виросовалась и с ним можно было работать. Но каждый слип увелизивает шанс. что юзер что-то испортит.
Ответить с цитированием
  #6  
Старый 07.12.2015, 20:52
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от nixon232
...как решить мою задачу без мышки...
Может попробовать добраться до элемента саб-меню попапки напрямую или вызов горячей клавиши на это действо организовать?
Ответить с цитированием
  #7  
Старый 07.12.2015, 22:32
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Alegun
Может попробовать добраться до элемента саб-меню попапки напрямую или вызов горячей клавиши на это действо организовать?

каким оброзом можно добраться до меню? ведь я и хедл его не знаю(код чужой)
Ну допустим я вызову попап кликом, получу хендл, а как выбрать сабменю ?
Ответить с цитированием
  #8  
Старый 07.12.2015, 22:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

На самом деле нужно смотреть ресурсы мастер-программы, меню\попапки могут храниться там под индексами что пользует мастер, их возможно можно и вытащить, хотя раз хэндла нету...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter