Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2015, 14:44   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Как отследить координаты нажатия ЛКМ в конкретном приложении ( известно заголовок окна) относительно этого приложения

Искал, но конкретного мало чего нашел.
Помогите чем сможете. Заранее спасибо.
Illusiony вне форума Ответить с цитированием
Старый 10.10.2015, 15:02   #2
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

найти интересуемое окно (FindWindow function, EnumWindows function, FindWindowEx function etc) далее GetCursorPos function + ScreenToClient function
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 10.10.2015, 16:14   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

У меня работает определение координат по таймеру в чужом приложении, но как определить координаты в момент клика?
Illusiony вне форума Ответить с цитированием
Старый 10.10.2015, 20:58   #4
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

чтобы "поймать" клик используйте сабклассинг препарируемого окна или хук на мышь
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 10.10.2015, 21:05   #5
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Код:
procedure TForm1.Image1DblClick(Sender: TObject);
 var RadioButton: TRadioButton;
E: Tpoint;

begin
 RadioButton:=TRadioButton.Create(Form1);
  with RadioButton do
begin
    Parent:=Form1;
    E:=ScreenToClient(Form1.FDesignSize);
    left:=Mouse.CursorPos.X+E.X;
    top:=Mouse.CursorPos.Y+E.Y;
    Caption:='X= '+IntToStr(Mouse.CursorPos.X+E.X-Customer[var_integer[16]].Customer_center_of_rotation.X)
           +'    Y= '+IntToStr(Mouse.CursorPos.Y+E.Y-Customer[var_integer[16]].Customer_center_of_rotation.Y);
end;
 end;
Репутация: полный "0"

Последний раз редактировалось Stilet; 11.10.2015 в 17:09.
zvygin1964 вне форума Ответить с цитированием
Старый 10.10.2015, 21:12   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
zvygin1964
Это с другой оперы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.10.2015, 22:08   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Код:
type
  TForm1 = class(TForm)
    lbl1: TLabel;
    btn1: TButton;
    tmr1: TTimer;
    lbl2: TLabel;
    lbl3: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  num:Integer;//счетчик кликов
  naj,otj:BOOL;// сохранения в переменных состояния нажатия ЛКМ отжата или нажата.
  p: TPoint;
  WindowRect: TRect;// это для преобразование глобальных координат в координаты относительно текущего окна


implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  tmr1.Enabled:=True;


end;

procedure TForm1.tmr1Timer(Sender: TObject);
var W:Word;
S:String;
h:HWND;

header:HWND; 
apchar:array[0..254] of char;

begin
header:=GetForegroundWindow; // получаем заголовок текущего активного окна
GetWindowText(header, apchar, Length(apchar));
 lbl2.Caption:=apchar;


{if getasynckeystate($01)<>0 then begin
  num:=num+1;
lbl1.Caption:=IntToStr(num);
end;}

h := findwindow(nil, 'Окно нужной программы');
 if (h<>0)and(apchar='Окно нужной программы')then begin // проверяем  является ли текущее активное окно окном  Hearthstone



      W:=GetAsyncKeyState(VK_LBUTTON);// определения параметров состояния кнопок мыши

      if W = $8001 then begin
      S :='кнопка нажата';
      if  otj=True then begin
       num:=num+1;
       lbl1.Caption:=IntToStr(num);
             //Узнаем положение и размеры найденого окна блокнота
      
     GetWindowRect(H, WindowRect); // это для преобразование глобальных координат в координаты относительно текущего окна
      GetCursorPos(p); // берем глобальные координаты курсора

      lbl3.Caption:=IntToStr(p.x- WindowRect.Left)+':'+IntToStr(p.y- WindowRect.Top); // вывожу координаты курсора относительно самого  текущего окна
      end;
      naj:=True;
      otj:=False;
      end;

      if W = $8000 then begin
       S := 'кнопка давно нажата';
      end;
      if W = $0000 then begin
      S := 'кнопка отпущена';
      if  naj=True then begin
       //num:=0;
      end;
      otj:=True;
       naj:=False;
      end;
      S := 'учи матчасть';


      //lbl1.Caption:=Format('%s %.4x',[S , W] );
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  num:=0;
  naj:=False;
  otj:=True;
  lbl2.Caption:='';
end;

end.

Вроде так работает.

Вопрос какой интервал опроса таймера поставить? сейчас стоит 30 миллисекунд.
И есть ли ( и стоит ли) способ обойтись без таймера и событие отсеживать именно в момент нажатия?

Последний раз редактировалось Illusiony; 11.10.2015 в 18:32.
Illusiony вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция нажатия ЛКМ в приложении под мышкой Illusiony Общие вопросы Delphi 4 09.05.2014 16:37
как реализовать в WPF захват нажатия мыши вне окна моего приложения Doskarayev WPF, UWP, WinRT, XAML 1 23.11.2013 15:53
Отследить открытие дочернего окна в чужом приложении s77lanselot77s C# (си шарп) 3 16.07.2012 21:35
Изменить заголовок окна в консольном приложении interfeys Общие вопросы C/C++ 10 01.01.2011 15:24