Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Вниз
плавное перемещение Найти похожие ветки
← →
asphix © (2004-08-27 11:12) [0]Помогите советом. Написал прогу, перехватывающую нажатие некоторых клавиш для управления курсором мыши. Проблема в том, что очеь медленно перемещается :( Делаю setcursorpos(x+1,y) например. Мышь еле ползёт.. как бы ускорить процесс и добавить плавности?
← →
KADAN © (2004-08-27 11:26) [1]делать ускорение: нажал клавишу, мыша перемещается сначала на 1, потом на два, потом на три...
и еще одно... делать это не от нажатия клавиш, а при keydown запустить таймер, при KeyUp прекратить...
← →
Rem (2004-08-27 11:31) [2]
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;
← →
Rem (2004-08-27 11:38) [3]Можно еще вот это добавить:
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;
...
← →
asphix © (2004-08-27 11:59) [4]примерно так и пробовал. Просто стоит hook на 4 клавиши.. и на системном уровне всё происходит медленно :( Может как вариант, попробовать при нажатии нужной клавиши вызывать системное событие двидения мыши? или такого не может быть?
← →
Rem (2004-08-27 12:03) [5]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 движений.
← →
KADAN © (2004-08-27 12:34) [6]вот немного изменил идею 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<0 then signX:=-1 else signX:=1;
if incY<0 then signY:=-1 else signY:=1;
SetCursorPos(P.X, P.Y);
if boolean(incx) and (abs(incx)<maxspeed*speedstep) then incX:=(abs(incX)+1)*signX;
if boolean(incy) and (abs(incy)<maxspeed*speedstep) then incY:=(abs(incY)+1)*signY;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if cancel then begin
Unit1.Key:=Key;
case Key of
VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN: begin
timer1.Interval:=TimerInterval;
timer1.Enabled:=true;
cancel:=false;
end;
end;
end;
end;
end.
← →
Rem (2004-08-27 12:46) [7][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;
← →
Rem (2004-08-27 12:50) [8]Так красивее будет:
GetCursorPos(P);
SetCursorPos(P.X + IncX, P.Y + IncY);
:)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c