Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1151174171
gamebit3000
2006-06-24 22:36
2006.09.03
Добавление строк из одной таблицы в другую


15-1154673710
Separator
2006-08-04 10:41
2006.09.03
Мелкий глюк форума


5-1139064519
Admeral
2006-02-04 17:48
2006.09.03
Указатель на себя


15-1154226584
SPeller
2006-07-30 06:29
2006.09.03
Не ту страну назвали гoндурacoм...


2-1155660880
ex32Le
2006-08-15 20:54
2006.09.03
String To array of byte





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