скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Как заставить мышь сдвинуться на нужную позицию



Жили были дед да баба. Говорит старик старухе:
- Старая, давай колобка склеим и пусть он смастерит первый в лесу компьютер.
Бабка согласилась, слепила колобка, поручила ему собрать компьютер.
Катится Колобок по лесу, видит - волк идет. Колобок у него и спрашивает:
- Волк, а Волк, а хочешь системным блоком стать?
- А что это такое?
- Это значит, что ты будешь сидеть и тебя люди кормить сами будут: дискетками, дисками...
- Хочу! - сказал Волк и стал системным блоком. Идет колобок дальше. Вдруг видит - лиса, он ей и говорит:
- Лиса, а Лиса, а хочешь быть монитором?
- А что это такое?
- Ну, это когда ты будешь смотреть на людей, подглядывать, а они ничего и не заподозрят.
- Хочу! - сказала Лиса и стала монитором.
Покатился Колобок дальше. Тут ежик дорогу перебегает. Он его остановил и спрашивает:
- Ежик, а Ежик, а хочешь быть клавиатурой?
- А что это такое?
- Это когда люди тебе будут спинку почесывать, да поглаживать каждый день, а ты лежать будешь.
- Хочу! - сказал Ежик и стал клавиатурой.
Пошел Колобок дальше. Видит - мышь бежит. Он ее поймал и спрашивает:
- Мышь, а Мышь, а хочешь быть компьютерной мышкой?
- А это что такое, и как?
- Это когда люди тебя каждый день за шкирку будут брать и таскать по коврику туда - сюда, туда - сюда.
- Да пошел ты в ж#пу, Колобок!!!
С тех пор у мышки в ж#пе колобок...

Эта статья даёт вам возможность управлять положением курсора мыши. Теперь вы сможете указывать пользователю, что именно он должен сделать, и не позволять ему делать то, что вам не нравится. Ну, и, даже если вы будете просто хаотично передвигать мышь, пользователь будет просто беситься!..

Для начала мы научимся узнавать где находится курсор мыши, ведь в зависимости от этого будем принимать решение. Это мы можем сделать с помощью функции GetCursorPos(). В качестве параметра ей нужно указать адрес структуры TPoint - это попросту точка. У объектов данного класса есть два поля: X и Y, которые описывают непосредственно координаты точки. Если функция выполнится успешно, она вернёт значение true, иначе - false. Например, следующий пример сдвигает кнопку по её нажатию и вместе с ней курсор мыши, чтобы по следующему нажатию щелчок мышью не пришёлся на область, расположенную за пределами кнопки. Этот эффект можно увидеть в программе 3D Studio MAX, на временной шкале, которая позволяет передвигаться по кадрам фильма.


procedure TForm1.Button6Click(Sender: TObject);
var
  p: TPoint;
begin
  if GetCursorPos(p)=true then
  begin
    SetCursorPos(p.X+5,p.Y);
    Button6.Left:=Button6.Left+5;
  end;
end;

В этом примере так же используется функция SetCursorPos, которая задаёт положение курсору мыши. Ей в скобках нужно указать два числовых значения X и Y, которые определяют координаты нового положения курсора.

Я эту функцию использовал в одной из своих программ. Было это, когда я писал About. На самом видном месте окна я установил метку-гиперссылку, указав в её заголовке свой e-mail. Но почему-то мне показалось, что этого не достаточно, чтобы привлечь внимание пользователя, тогда я заставил указатель мыши перемещаться к этой метке, и "пальцем" указывать на неё, в тот момент, когда мышь доползала до нужного места. Не заметить мой e-mail было просто невозможно!!!

Для этого нужно сделать следующее:

  • Поместите на форму компонент типа TLabel
  • Вынесите компонент TTimer
  • Объявите две глобальных переменные:

var
  x_need, y_need: integer;

именно в них мы будем отслеживать координаты нужной позиции для указателя мыши

По событию формы OnActivate() активизируйте переменные:


x_need := Label1.Left + Form1.Left + 20;
y_need := Label1.Top + Form1.Top + 30;

По событию OnTimer для компонента Timer напишите:


procedure TForm1.Timer1Timer(Sender: TObject);
var
  t: TPoint;
  changex, changey: integer;
begin
  GetCursorPos(t);
  if t.y<>y_need then
  begin
    if t.Y>y_need then
      changey:=-1
    else
      changey:=1;
    SetCursorPos(t.X,t.Y+changey);
  end
  else
  begin
    if t.x<>x_need then
    begin
      if t.X>x_need then
        changex:=-1
      else
        changex:=1;
      SetCursorPos(t.X+changex,t.Y);
    end
    else
      Timer1.Enabled:=false;
  end;
end;

Скомпилируйте [F9] и убедитесь, что скорость движения слишком маленькая - отрегулируйте её с помощью свойства Timer'a Interval. Значение этого свойства обратнопропорционально скорости движения указателя мыши.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook