Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

плавное перемещение [D7, WinXP]


asphix ©   (2004-08-27 11:12:00) 

Помогите советом. Написал прогу, перехватывающую нажатие некоторых клавиш для управления курсором мыши. Проблема в том, что очеь медленно перемещается :( Делаю setcursorpos(x+1,y) например. Мышь еле ползёт.. как бы ускорить процесс и добавить плавности?


Rem   (2004-08-27 12:50:00) [1]

Так красивее будет:

GetCursorPos(P);
SetCursorPos(P.X + IncX, P.Y + IncY);


:)


Rem   (2004-08-27 12:46:00) [2]

[6]
 Ух, сколько глобальных переменных! :)

type
 TForm1 = class(TForm)
 ...
 private
   m_iCount: integer;
 end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
IncX: integer;
IncY: integer;
i: integer;
P: TPoint;
begin
IncX := 0;
IncY := 0;
inc(m_iCount);
case Key of
  VK_LEFT: IncX := -(m_iCount div 10 + 1);
  VK_RIGHT: IncX := (m_iCount div 10 + 1);
  VK_UP: IncY := -(m_iCount div 10 + 1);
  VK_DOWN: IncY := (m_iCount div 10 + 1);
end;
GetCursorPos(P);
P.X := P.X + IncX;
P.Y := P.Y + IncY;
SetCursorPos(P.X, P.Y);
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 m_iCount := 0;
end;


KADAN   (2004-08-27 12:34:00) [3]

вот немного изменил идею Rem:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure FormKeyUp(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure Timer1Timer(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 cancel:boolean=true;
 IncX: integer;
 IncY: integer;
 P: TPoint;
 key:cardinal;

const
 MAXSPEED=10;//â ïèêñåëàõ
 SPEEDSTEP=10;//êîëè÷åñòâî ïðîõîäîâ öèêëà, äëÿ óâåëè÷åíèÿ ñêîðîñòè
              //÷åì ìåíüøå ÷èñëî, òåì ñèëüíåå áóäåò óñêîðÿòüñÿ
 TimerInterval=10;

implementation

{$R *.dfm}

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 cancel:=true;
 IncX := 0;
 IncY := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var signX, SignY:integer;
begin
 if cancel then begin timer1.Enabled:=false; exit; end;
 if (incX=0) and (incY=0) then begin
   cancel:=false;
   case Key of
     VK_LEFT: IncX := -10;
     VK_RIGHT: IncX := 10;
     VK_UP: IncY := -10;
     VK_DOWN: IncY := 10;
   end;
 end;
 GetCursorPos(P);
 P.X := P.X + IncX div speedstep;
 P.Y := P.Y + IncY div speedstep;
 if incX


Rem   (2004-08-27 12:03:00) [4]

cм. внимательно:
for i := 0 to 5 do
begin
  GetCursorPos(P);
  P.X := P.X + IncX;
  P.Y := P.Y + IncY;
  SetCursorPos(P.X, P.Y);
  Sleep(10);
end;


За одно нажатие - 5 движений.


asphix   (2004-08-27 11:59:00) [5]

примерно так и пробовал. Просто стоит hook на 4 клавиши.. и на системном уровне всё происходит медленно :( Может как вариант, попробовать при нажатии нужной клавиши вызывать системное событие двидения мыши? или такого не может быть?


Rem   (2004-08-27 11:38:00) [6]

Можно еще вот это добавить:

var
 Incr: integer;
 ...
begin
 if (ssCtrl in Shift) then
   Incr := 3
 else
   Incr := 1;
 case Key of
   VK_LEFT: IncX := -Incr;
   VK_RIGHT: IncX := Incr;
   VK_UP: IncY := -Incr;
   VK_DOWN: IncY := Incr;
 end;
...


Rem   (2004-08-27 11:31:00) [7]

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var
 IncX: integer;
 IncY: integer;
 i: integer;
 P: TPoint;
begin
 IncX := 0;
 IncY := 0;
 case Key of
   VK_LEFT: IncX := -1;
   VK_RIGHT: IncX := 1;
   VK_UP: IncY := -1;
   VK_DOWN: IncY := 1;
 end;
 for i := 0 to 5 do
 begin
   GetCursorPos(P);
   P.X := P.X + IncX;
   P.Y := P.Y + IncY;
   SetCursorPos(P.X, P.Y);
   Sleep(10);
 end;
end;


KADAN   (2004-08-27 11:26:00) [8]

делать ускорение: нажал клавишу, мыша перемещается сначала на 1, потом на два, потом на три...
и еще одно... делать это не от нажатия клавиш, а при keydown запустить таймер, при KeyUp прекратить...


Наверх

Титульная страница Поиск, карта сайта Написать письмо