Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2

Получение координат курсора при нажатии левой клавиши мыши

02.05.2015, 18:28. Показов 6424. Ответов 5

Студворк — интернет-сервис помощи студентам
Короче, чтоб долго тут не повествовать, объясните, почему не работает код:
Pascal
1
2
3
4
5
6
7
8
9
uses mouse, crt;
begin
        initmouse;
        repeat
                if (getmousebuttons =  mouseleftbutton)  then
                        writeln(getmousex, ' ' , getmousey, ' ');
        until keypressed;
        donemouse;
end.
ХОЧУ: координаты курсора при нажатии левой клавиши мыши
ПОЛУЧАЮ НА ДЕЛЕ: ничего иногда может вывести координаты, но длится это считанные секунды, дальше - тишина...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2015, 18:28
Ответы с готовыми решениями:

Ограничить передвижение курсора мыши левой нижней четвертью экрана.При нажатие левой клавиши мыши выключить индикатор NumLock(+Звук),при нажатие право
Не могу решить подскожите кто знает.(Ограничить передвижение курсора мыши левой нижней четвертью экрана.При нажатие левой клавиши мыши...

Отслеживание нажатие левой кнопки мыши и получение координат курсора
Как можно в программе отследить, что была нажата левая кнопка мыши и при возможности узнать координаты курсора?

Включать курсор при нажатии левой клавиши, а выключать по нажатию правой клавиши мыши
Нужно: Включать курсор при нажатии левой клавиши, а выключать по нажатию правой клавиши мыши. Почему не работает? И что сделать, чтобы...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8658 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
02.05.2015, 21:35
Слегка переделанный пример из rtl.pdf стр.941 (приведён в "c:\FPC\2.6.4\sources\fpcdocs\mouseex\ex 5.pp")
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
program Example5;
 
{ Program to demonstrate the HideMouse function. }
 
uses
  mouse;
 
var
  Event: TMouseEvent;
  Visible: boolean;
 
begin
  InitMouse;
  ShowMouse;
  Visible := True;
  Writeln('Press left mouse button to coordinates show, right button quits');
  repeat
    GetMouseEvent(Event);
    with Event do
      if (Buttons = MouseLeftbutton) and (Action = MouseActionDown) then
      begin
        Writeln('X,Y= ( ', X, ' , ', Y, ' ) ');
      end;
  until (Event.Buttons = MouseRightButton) and (Event.Action = MouseActionDown);
  DoneMouse;
end.
Возможно, мешает CRT. Он графике точно мешает.
Миниатюры
Получение координат курсора при нажатии левой клавиши мыши  
1
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
02.05.2015, 22:48  [ТС]
ФедосеевПавел, и все же полно мистики осталось.
1) если в вашем примере для левой кнопки поменять down на up - не работает
2) мой пример и без crt не пашет. почему???


Добавлено через 5 минут
со своей задачае я уже, вроде, справился. но остались вопросы, хотелось бы разобраться...
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8658 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
02.05.2015, 23:30
Я не сразу понял, что происходит при работе с мышью. Сделал тест
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
program Example5;
 
{ Program to demonstrate the HideMouse function. }
 
uses
  mouse;
 
var
  Event: TMouseEvent;
  Visible: boolean;
  Buttons: byte;
 
begin
  InitMouse;
  ShowMouse;
  Visible := True;
  Buttons := DetectMouse;
  if Buttons = 0 then
    Writeln('No mouse present.')
  else
    Writeln('Found mouse with ', Buttons, ' buttons.');
  Writeln('Press left mouse button to coordinates show, right button quits');
  repeat
    GetMouseEvent(Event);
    with Event do
    begin
      writeln(Buttons, '->', Action, ' X,Y= ( ', X, ' , ', Y, ' ) w');
 (*     if (Buttons = MouseLeftbutton) and (Action = MouseActionDown) then
      begin
        Writeln('X,Y= ( ', X, ' , ', Y, ' ) +');
      end;*)
      if (Buttons = MouseLeftButton) and (Action = 2{ MouseActionUp <> 0}) then
      begin
        Writeln('X,Y= ( ', X, ' , ', Y, ' ) -');
      end;
      if (Buttons = MouseMiddleButton) and (Action and MouseActionUp <> 0) then
      begin
        Writeln('X,Y= ( ', X, ' , ', Y, ' ) -0-');
      end;
    end;
  until (Event.Buttons = MouseRightButton) and (Event.Action = MouseActionDown);
  DoneMouse;
end.
И что вижу.
При нажатии ЛКМ
Code
1
1->1
При отпускании
Code
1
0->2
Нажатие ЛКМ, потом ПКМ, отпускание ПКМ, отпускание ЛКМ
Code
1
2
3
4
1->1 нажатие ЛКМ
3->1 нажатие ПКМ (итого ЛКМ+ПКМ)
1->2 отпускание ПКМ
0->2 отпускание ЛКМ
Т.е. нужно проверять событие 2 (ButtonUp), и смотреть, чтобы в Buttons был равен 0-ю бит, ответственный за ЛКМ плюс запомненное состояние нажатости ЛКМ в прошлой обработке.
Т.е. примерно так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
program Example5;
 
{ Program to demonstrate the HideMouse function. }
 
uses
  mouse;
 
var
  Event: TMouseEvent;
  Visible: boolean;
  Buttons: byte;
 
begin
  InitMouse;
  ShowMouse;
  Visible := True;
  Buttons := DetectMouse;
  if Buttons = 0 then
    Writeln('No mouse present.')
  else
    Writeln('Found mouse with ', Buttons, ' buttons.');
  Writeln('Press left mouse button to coordinates show, right button quits');
  repeat
    GetMouseEvent(Event);
    with Event do
    begin
      if (Buttons = MouseLeftbutton) and (Action = MouseActionDown) then
      begin
        Writeln('X,Y= ( ', X, ' , ', Y, ' ) +');
      end;
      if (Buttons and MouseLeftButton = 0) and (Action = MouseActionUp) then
      begin
        Writeln('X,Y= ( ', X, ' , ', Y, ' ) -');
      end;
    end;
  until (Event.Buttons = MouseRightButton) and (Event.Action = MouseActionDown);
  DoneMouse;
end.
На деле должно быть сложнее - запоминать состояние нажатой ЛКМ и его добавлять в условие, но это уже детали - главное было понять, какие сигналы выдаются при нажатии отпускании.
1
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
03.05.2015, 16:30  [ТС]
ФедосеевПавел, я тоже разобрался. Все события мыши хранятся в очереди. Так что без использования метода GetMouseEvent, который достает из очереди событие, ничего не получится. Если расскомментировать строки - программа работает (выхожу по ctrl+c, ибо ленивый )
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses mouse;
var
    cursor : tmouseevent;
begin
    initmouse;
    showmouse;
 
    repeat
        writeln(getmousebuttons, ' ', getmousex, ' ', getmousey);
        {while pollmouseevent(cursor) do
            getmouseevent(cursor);}
    until false;
 
    donemouse;
end.
Добавлено через 1 час 50 минут
и тут я узнал, что для графического режима нужно использовать winmouse

Добавлено через 4 часа 57 минут
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Возможно, мешает CRT. Он графике точно мешает.
а тут можно поподробнее? как црт мешает графике?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8658 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
03.05.2015, 17:04
Цитата Сообщение от rattrapper Посмотреть сообщение
как црт мешает графике?
В FPC (не в TurboPascal) в ОС Windows модули CRT и Graph конфликтуют друг с другом. Я детали уже не помню, но не выводился текст на экран, не рисовались линии. Спасением являлась замена CRT на WinCRT (из состава FPC). Там тоже не всё гладко - не все возможности CRT присутствуют (модуль сильно усечён - см. rtl.pdf).
Есть сторонняя библиотека WinGraph, в ней есть WinGraph, WinMouse и WinCRT - имена совпадают. Только нужно перекомпилировать все исходники в режиме совместимости Delphi (можно добавить в начале файлов строку {$mode Delphi}).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2015, 17:04
Помогаю со студенческими работами здесь

При нажатии левой клавиши "мыши" отразить курсор в левой половине экрана, а при нажатии правой - в правой
При нажатии левой клавиши &quot;мыши&quot; отразить курсор в левой половине экрана, а при нажатии правой - в правой, использовав в случае...

Баг при нажатии левой клавиши мыши
Баг заключается в том что, при нажатии левой кнопки мыши он как бы &quot;залипает&quot;, стал замечать при прокрутке страничке браузера с помощью...

Получение координат курсора при захваченной мыши
Здравствуйте. По условию мышь захвачена одним дочерним окном. Задача - при этой захваченной мыши определить координаты курсора...

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

Событие мыши: перемещение мыши при нажатой левой клавиши
Подскажите, пожалуйста как реализовать следующее: При перемещении мыши при нажатой левой клавише (выделение текста) выводится сообщение...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru