![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать что мышка перестала двигаться? [D7, XP]
FANAT_WP © (2006-08-13 21:53:00)Не могу додуматься как выяснить что мышка перестала двигаться....
казалось...
присваиваем значение курсора переменной...
в следующий момент присваиваем значение другой переменной ( ведь мышка двигается.... и следующее значение отлично от предыдущего... так??).... так...
потом их сравниваем.....
все.....
но вот что я написал.... и это не работает....
что не так???
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;
списибо ... если кто разберется с моей задачкой.... :-)
!_SM_! (2006-08-15 00:39:00) [1]> [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 не делать...
Zeqfreed (2006-08-13 22:48:00) [2]> [0] FANAT_WP (13.08.06 21:53)
Если же говорить касательно приведенного в [0] кода, то самое главное, что бросается в глаза это то, что цикл будет выполнен только один раз. В остальное вникать даже не хочется.
Zeqfreed (2006-08-13 22:25:00) [3]
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.