![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
плавное перемещение [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 прекратить...