Главная страница
    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.033 c
14-1093090633
Вольный Стрелок
2004-08-21 16:17
2004.09.12
настройка Opera 7 для чтения news-конференций


3-1092742537
Эдик Дятлов
2004-08-17 15:35
2004.09.12
Как получить подключенных пользователей в базе SQL Anywhere


14-1092983887
Andy BitOff
2004-08-20 10:38
2004.09.12
Кто помнит?


3-1092639235
Руслан
2004-08-16 10:53
2004.09.12
ODA Error: пишет при создании dbf файла


14-1093417548
Суслик
2004-08-25 11:05
2004.09.12
Статья из RSDN





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский