0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 9

Считывание координат курсора при нажатии ЛКМ

15.01.2012, 18:03. Показов 5672. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Пишу небольшой автокликер. Столкнулся с проблемой, нужно считать координаты курсора, как и в любом кликере. Вот что придумал я: юзером жмется кнопка "Указать цель", курсор изменяет свой внешний вид и SpeedButton.Down переходит в True, далее ожидается ЛКМ. Если ЛКМ произошло, считать координаты курсора, присвоить полям GetX и GetY (TEdit) соотв. значения, изменить курсор на стандартный и SpeedButton.Down:=False.
Из всего этого не знаю, как ожидать ЛКМ.
Вот что получилось у меня:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.SButtonGetPosClick(Sender: TObject);
var
    Point1: TPoint;
begin
    PageControl1.Pages[0].Cursor:=crCross;
     ...
        [ожидать левый клик]
     ...
    GetCursorPos(Point1);
    GetX.Text:=IntToStr(Point1.X);
    GetY.Text:=IntToStr(Point1.Y);
    SButtonGetPos.Down:=False;
    PageControl1.Pages[0].Cursor:=crDefault;
end;
Помогите, пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2012, 18:03
Ответы с готовыми решениями:

Как отцентровать форму по положению курсора мыши при нажатии на колесико или ПКМ+ЛКМ?
При щелчке центральной клавиши мыши или обоих крайних клавишей форма центрируется по указателю курсора

"Определение и сохранение координат при нажатии на картинке ЛКМ"
Задача заключается в следующем: Использую "Opera", при открытии странички, по середине находится картинка ".jpg" представляющая...

Определение координат курсора при нажатии на дерево CTreeCtrl
Необходимо в MFC при нажатии левой кнопки мыши в пределах окна дерева CTreeCtrl определить координаты положения курсора. У CTreeCtrl нет...

7
Автор FAQ
Автор FAQ
 Аватар для REALIST07
644 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
15.01.2012, 19:02
Попробуй все это запихнуть в функцию,а ожидание реализуется либо с помощью своего события либо с помощью таймера
Цитата Сообщение от Se7enfold Посмотреть сообщение
GetCursorPos(Point1); GetX.Text:=IntToStr(Point1.X); GetY.Text:=IntToStr(Point1.Y); SButtonGetPos.Down:=False; PageControl1.Pages[0].Cursor:=crDefault;
Добавлено через 39 секунд
Изменяй состояния таймера
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 9
15.01.2012, 19:50  [ТС]
Не понял, как здесь может пригодиться таймер? Можно немного подробнее?
Мне-то ждать нужно не определенное время, а приостановить выполнение процедуры до тех пор, пока не будет нажата левая кнопка мыши.
0
Автор FAQ
Автор FAQ
 Аватар для REALIST07
644 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
15.01.2012, 20:08
Смотри,если допустим мне нужно отловить нажатие какой-то клавиши я пользуюсь либо хуками либо функцией GetAsyncKeyState
Как вариант можно сделать такое:
Delphi
1
2
3
4
5
6
7
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if (GetAsyncKeyState(#01)<>0) then begin
   MyFunc();
   Timer1.Enabled:=False;
 end;
end;
А вот тут такое:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.SButtonGetPosClick(Sender: TObject);
var
    Point1: TPoint;
begin
    PageControl1.Pages[0].Cursor:=crCross;
    timer1.enabled:=true;
    
end;
1
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
15.01.2012, 20:17
тут можно использовать 3 варианта
1. ф-я GetKeyState() + таймер (интервал поменьше поставь)
2. Установкой хука (hook)
3. установка LL hook (Low Level hook)

по мне 3 вариант лучше всего подходит, не нужна dll как во 2 варианте
1
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 9
16.01.2012, 01:22  [ТС]
Спасибо за советы, частично реализовано с помощью GetKeyState. С хуком никогда не сталкивался (мой опыт программирования крайне небольшой). Вот что получилось:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.SButtonGetPosClick(Sender: TObject);
begin
    PageControl1.Pages[0].Cursor:=crCross;
    TimerLMB.Enabled:=True;
end;
 
procedure TForm1.TimerLMBTimer(Sender: TObject);
Var
  Point1: TPoint;
begin
 if (GetKeyState(VK_LBUTTON)<>0) then begin
    GetCursorPos(Point1);
    GetX.Text:=IntToStr(Point1.X);
    GetY.Text:=IntToStr(Point1.Y);
    SButtonGetPos.Down:=False;
    PageControl1.Pages[0].Cursor:=crDefault;
    TimerLMB.Enabled:=False;
 end;
end;
Проблема в том, что время от времени (2 из 10 раз) условие выполняется и без клика, закономерности не нашел. Я думаю, что он принимает клик по SpeedButton'у за "тот самый" клик. Кроме того, если кликать немного медленнее (зажимать кнопку на полсекунды), то работает корректно. От интервала таймера ничего не зависит. Если использовать GetAsyncKeyState, то с любой другой клавишей работает без проблем, но стоит проверять ЛКМ, и условие начинает выполняться в Любом случае.
Что это?
0
Автор FAQ
Автор FAQ
 Аватар для REALIST07
644 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
16.01.2012, 01:28
А по умолчанию ты поставил в свойстве enable:false?
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 9
16.01.2012, 03:11  [ТС]
Да, поставил.

Добавлено через 20 минут

Все-таки от скорости нажатия не зависит ничего. Полный рандом.
Видимо, придется разбираться с хуком. Но все равно интересно, почему здесь так происходит.

Добавлено через 1 час 15 минут


Вопрос решен без применения хука.
Решение нагуглил на иностранном форуме. Нужно было слегка допилить условие:
Delphi
1
 if HiByte(GetKeyState(VK_LBUTTON)) <> 0 then begin
Теперь можно использовать и GetAsyncKeyState.
Вот что получилось в итоге:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.SButtonGetPosClick(Sender: TObject);
begin
    PageControl1.Pages[0].Cursor:=crCross;
    TimerLMB.Enabled:=True;
end;
 
procedure TForm1.TimerLMBTimer(Sender: TObject);
Var
  Point1: TPoint;
begin
 if HiByte(GetAsyncKeyState(VK_LBUTTON)) <> 0 then begin
    GetCursorPos(Point1);
    GetX.Text:=IntToStr(Point1.X);
    GetY.Text:=IntToStr(Point1.Y);
    SButtonGetPos.Down:=False;
    PageControl1.Pages[0].Cursor:=crDefault;
    TimerLMB.Enabled:=False;
 end;
end;
Почему именно проверка байта старшего разряда - не знаю. Но работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2012, 03:11
Помогаю со студенческими работами здесь

Получение координат курсора при нажатии левой клавиши мыши
Короче, чтоб долго тут не повествовать, объясните, почему не работает код: uses mouse, crt; begin initmouse; repeat...

Считывание координат (x;y) курсора мышки
Всем доброго время препровождения Есть необходимость считать ось &quot;y&quot; курсора По алгоритму типа: Если зажата СКМ и значение оси...

Считывание координат курсора над формой
Доброго дня. Имеется форма с двумя текстбоксами. Требуется выводить обе координаты курсора в них, если курсор движется над формой. ...

Построение графиков и считывание координат расположения курсора
Здравствуйте, допустим у меня есть некий график построенный. Я вожу курсором по этому графику и при нажатии на кнопку мыши необходимо чтоб...

При 2-ом нажатии на ЛКМ выходит поиск
Всем привет! Появилась такая проблемка,при кликанье на ярлык или папку ЛКМ выскакивает поиск! В чём может быть проблема?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru