Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1093136182
массив
2004-08-22 04:56
2004.09.12
Почему нельзя сделать строкой динамический массив ?


1-1093597779
Goorus
2004-08-27 13:09
2004.09.12
Add to AutoRun


3-1092762020
Loaderz
2004-08-17 21:00
2004.09.12
Длина строк в БД.


1-1092302454
GrayFace
2004-08-12 13:20
2004.09.12
Алгоритмы сортировки


1-1093237429
Vlad123
2004-08-23 09:03
2004.09.12
Как установить фокус на Button2 ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский