Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Как узнать что мышка перестала двигаться?   Найти похожие ветки 

 
FANAT_WP   (2006-08-13 21:53) [0]

Не могу додуматься как выяснить что мышка перестала двигаться....
казалось...
присваиваем значение курсора переменной...
в следующий момент присваиваем значение другой переменной ( ведь мышка двигается.... и следующее значение отлично от предыдущего... так??).... так...
потом их сравниваем.....
все.....
но вот что я написал.... и это не работает....
что не так???

procedure TForm1.Timer1Timer(Sender: TObject);
var
foo: TPoint;
x_point, x1_point: integer;

begin
 x1_point:=1;
 repeat
 GetCursorPos(foo);
 Label1.Caption:=("(" + IntToStr(foo.X) + " ," + IntToStr(foo.Y) + ")");
 x_point:=foo.X;
 if x_point = x1_point then Label2.Caption:=" СТОИМ "
 else begin
 Label2.Caption:=" ДВИГАЕМСЯ ";
 end;
 x1_point := x_point;
 until true;
end;

списибо ... если кто разберется с моей задачкой.... :-)


 
Zeqfreed ©   (2006-08-13 22:25) [1]

unit Unit1;

interface

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

type
 TInputState = record
  InactiveTime : DWORD;
 end;

 TStateChangedProc = procedure(NewState : TInputState) of object;

 TInputHookingThread = class(TThread)
 private
  FStateChangedProc : TStateChangedProc;
  FCurrentState : TInputState;
  FLastPos : TPoint;
  FLastTime : DWORD;
  procedure UpdateState();
  procedure PerformStateUpdate();
  procedure UpdateStateData(InactiveTime : DWORD);
 public
  constructor Create(StateChangedProc : TStateChangedProc);
  procedure Execute; override;
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   procedure StateChanged(InputState : TInputState);
 public
   { Public declarations }
 end;

const
 MOVE_THRESHOLD = 100;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TInputHookingThread }

constructor TInputHookingThread.Create(StateChangedProc: TStateChangedProc);
var
 Pt : TPoint;
begin
 inherited Create(false);

 FCurrentState.InactiveTime := 0;
 FStateChangedProc := StateChangedProc;

 FCurrentState.InactiveTime := 0;

 GetCursorPos(Pt);
 FLastPos.X := Pt.X;
 FLastPos.Y := Pt.Y;
 FLastTime := GetTickCount;
end;

procedure TInputHookingThread.Execute;
var
 Pt : TPoint;
 cTime : DWORD;
begin
 //FreeOnTerminate := true;

 while True do begin
  GetCursorPos(Pt);
  if (Pt.X <> FLastPos.X) or (Pt.Y <> FLastPos.Y) then begin
   UpdateStateData(0);
   UpdateState();

   FLastPos.X := Pt.X;
   FLastPos.Y := Pt.Y;
  end else begin
   cTime := GetTickCount;

   UpdateStateData(cTime - FLastTime + FCurrentState.InactiveTime);
   UpdateState();

   FLastTime := cTime;
  end;
 end;
end;

procedure TInputHookingThread.UpdateStateData(InactiveTime : DWORD);
begin
 FCurrentState.InactiveTime := InactiveTime;
end;

procedure TInputHookingThread.PerformStateUpdate;
begin
 FStateChangedProc(FCurrentState);
end;

procedure TInputHookingThread.UpdateState;
begin
 Synchronize(PerformStateUpdate);
end;

{ TForm1 }

procedure TForm1.StateChanged(InputState: TInputState);
begin
 if (InputState.InactiveTime < MOVE_THRESHOLD) then
  Caption := "Moving"
 else
  Caption := Format("Idling for %d ms", [InputState.InactiveTime]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TInputHookingThread.Create(StateChanged);
end;

end.


Также можно глянуть в сторону GetLastInputInfo.


 
Zeqfreed ©   (2006-08-13 22:48) [2]

> [0] FANAT_WP   (13.08.06 21:53)

Если же говорить касательно приведенного в [0] кода, то самое главное, что бросается в глаза это то, что цикл будет выполнен только один раз. В остальное вникать даже не хочется.


 
!_SM_!   (2006-08-15 00:39) [3]

> [2] Zeqfreed ©   (13.08.06 22:48)

Да он там, этот цикл, вообще не при делах.... Дело в локальных переменных.

> [0] FANAT_WP   (13.08.06 21:53)
Можно и так попробовать:


var OldPos: TPoint;
...........
procedure TForm1.Timer1Timer(Sender: TObject);
var Pos: TPoint;
begin
  GetCursorPos(Pos);
  if (Pos.X<>OldPos.X) and (Pos.Y<>OldPos.Y) then Caption:="ДВИГАЕТСЯ" else Caption:="СТОИТ";
  OldPos:=Pos;
end;


PS Interval Таймера лучше ниже 100 не делать...



Страницы: 1 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
15-1154673710
Separator
2006-08-04 10:41
2006.09.03
Мелкий глюк форума


15-1155209259
ArtemESC
2006-08-10 15:27
2006.09.03
Не найдеться ли у кого звуков пишущей машинки...


1-1152901088
_mik
2006-07-14 22:18
2006.09.03
Перебор текста по словарю


1-1153397148
dracula
2006-07-20 16:05
2006.09.03
Как узнать - занят файл другим процессом или нет?


15-1154586310
Ega23
2006-08-03 10:25
2006.09.03
С Днём рождения! 3 августа