Пятница, 17.05.2024, 14:22
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
» Меню сайта

» Категории раздела
Delphi [2]
Программирование на Delphi
Моделирование [4]
Физика вместе с математикой и программированием! Должно быть интересно!

» Наш опрос
Вы первый раз на этом сайте?
Всего ответов: 45

» Форма входа


» Статистика


Яндекс.Метрика
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Программирование » Delphi

Работа с мышью в Delphi

Здравствуйте. Вы находитесь на старом сайте и просматриваете устаревшую версию статьи.

Последняя версия статьи: здесь

Однако, если Вам так хочется... статью отсюда я удалять не собираюсь.

Работа с мышью в Delphi

Кто из пользователей компьютера не использует мышь? Сейчас я расскажу, как больше узнать о ней из программы.
Сразу скажу, что можно пойти несколькими путями:
Можно извлекать информацию из объекта Mouse типа TMouse или использовать встроенные функции.

Серьёзно. Вы ещё не передумали? Последняя версия статьи: здесь

  • Итак, определение положения курсора на экране:


1)

 

 

 Mouse.CursorPos: TPoint

 


Получить компоненты X и Y можно так: Mouse.CursorPos.X и Mouse.CursorPos.Y

2) 

 

var pos:TPoint;
    begin
      GetCursorPos(pos);
      // здесь что-то делаем
    end;


Получение координат аналогично.

 

 

  • Скрытие курсора:

 

 

ShowCursor(bShow:LongBool):integer


Использование:

 

 

  ShowCursor(false);
  //что то делаем
  ShowCursor(true);

 

 

 

  • Изменение положения

1)

 

var pos:TPoint;
    begin
      pos.X:=100;
      pos.Y:=100;
      Mouse.CursorPos:=pos;
    end;


2)

  SetCursorPos(100,100);


Этот код моментально перенесет курсор в координаты (100;100)

 

  • Изменение назначения кнопок мыши

Изменение функций левой и правой кнопок мыши.

 

 

  SwapMouseButton(true); //- меняем местами
  SwapMouseButton(false); //- восстанавливаем обратно

 

 

  • Имитация нажатия кнопок мыши.

Для этого есть специальная функция:

 

 

mouse_event(dwFlags, dx, dy, dwData, dwExtraInfo: DWORD);


Вот константы, которые есть для этой функции:


Также, в более новых версиях есть и другие константы:

 

 

 

const
MOUSEEVENTF_XDOWN=$0080;
MOUSEEVENTF_XUP=$0100;


Move нужно для перемещения указателя мыши.
LeftDown, LeftUp, RightDown, RightUp, MiddleDown, MiddleUp - название говорит за себя.
XDown, XUp - нажатие и отпускание X-кнопки.
Absolute - само по себе ничего не далает, используется совместно с движением, задает абсолютные координаты.
Про Wheel сейчас я рассказывать не буду.

Итак, нажимать можно так:

 

 

 

Mouse_Event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
Mouse_Event(MOUSEEVENTF_LEFTUP,x,y,0,0);

Внимание, не забываем отпускать нажатые клавиши!
Не знаю как должно быть, но у меня x и y ни на что не влияют, т.е. всегда нажатие происходит под курсором (даже если использовать MOUSEEVENTF_ABSOLUTE, о нем я сейчас тоже расскажу)

Теперь будем двигать мышку:

 

 

Mouse_Event(MOUSEEVENTF_MOVE,100,100,0,0);

Хотя здесь я сам не всегда понимаю что эта функция делает...
Например из точки (0,0) она должа сместится в (100,100), но она смещается либо в (191,191), либо в (254,254) либо в (155,155) и т.п.
Объяснить такие действия я не могу... :)

Если координаты положительные мышь движется в право вниз, если отрицательные то влево вверх.
Курсор как система отсчёта
Итак, теперь я расскажу про MOUSEEVENTF_ABSOLUTE.
Его мы будет использовать вместе с MOUSEEVENTF_MOVE.

 

 

Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE,x,y,0,0);

Теперь функция будет работать независимо от положения курсора, система отсчета будет связана с экраном.
Монитор как система отсчёта
Но стоит учитывать что система отсчёта здесь немного особая, т.к. x и y имеют диапазон от 0 до 65535 и от них линейно зависит координата на мониторе.
Поэтому если хотим передвинуть курсор в нужную точку экрана мы вместь x и y будем писать round(65536*x/Screen.Width) и round(65536*y/Screen.Height) соответственно.

 

 

 

  • Немного ещё

Вообще объект Mouse использует все те же функции и процедуры...
Вот, например, что написано в Controls.pas (в нем хранится TMouse):

 

 

 

 

property CursorPos: TPoint read GetCursorPos write SetCursorPos;

function TMouse.GetCursorPos: TPoint;
begin
  Win32Check(Windows.GetCursorPos(Result));
end;

procedure TMouse.SetCursorPos(const Value: TPoint);
begin
  Win32Check(Windows.SetCursorPos(Value.x, Value.y));
end;


Так что, все делают одни и те же функции :)


А вот, что написано в Windows.pas (в нем хранятся SetCursorPos и GetCursorPos)

 

 

 

procedure mouse_event; external user32 name 'mouse_event';
function SetCursorPos; external user32 name 'SetCursorPos';
function GetCursorPos; external user32 name 'GetCursorPos';


В итоге все уходит в user32.dll :)

 

 


 

Публикация в интернет-ресурсах и печатных изданиях без указания автора (diversenok) запрещена. Материал представлен только для ознакомления и некоммерческого использования.
Категория: Delphi | Добавил: diversenok (24.05.2011) | Автор: diversenok
Просмотров: 13290 | Теги: мышь, курсор, программирование, Delphi | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
» Поиск

» Ссылки
  • Информатика.МЦНМО
  • RealtimeBoard

  • » Мини-чат
    200


    diversenok © 2011-2024
    Сайт создан в системе uCoz