Здравствуйте. Вы находитесь на старом сайте и просматриваете устаревшую версию статьи.
Последняя версия статьи: здесь
Однако, если Вам так хочется... статью отсюда я удалять не собираюсь.
Работа с мышью в 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 :)
|