Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];
Вниз
Как узнать что мышка перестала двигаться? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c