Práce s myší pro pokročilé

Klíčová slova: GetCursorPos, SetCursorPos, Mouse_Event, MOUSEEVENTF_ABSOLUTE, MOUSEEVENTF_MOVE, ClipCursor, MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP
Rubrika: Delphi

Pracovat s myší umí každý jen trochu zkušený uživatel PC. Tak proč to také nenaučit Vás. Následující článek vám poradí jak pomocí DELPHI ovládat myš a to nejen ve vaší aplikaci.

Tento článek není zaměřen na klasické zpracování událostí myši na jednotlivých komponentách, ale na přímé ovládání myši pomocí příkazů. Není na tom v podstatě nic těžkého. Základní funkce, které zde budou používány, jsou GetCursorPos, SetCursorPos a Mouse_Event.

Následující kód si nejprve zapamatuje výchozí pozici kurzoru. Poté v cyklu postupně přesune kurzor myši o 50 bodů dolů a doprava. Na konec se myš opět vrátí do výchozí pozice.

procedure TForm1.BitBtn3Click(Sender: TObject);
var
  i : integer;
  pt,pt_start : TPoint;
begin
  GetCursorPos(pt_start);
  pt := pt_start;
  for i := 0 to 50 do
  begin
    pt.x := pt.x + 1;
    pt.y := pt.y + 1;
    SetCursorPos(pt.x, pt.y);
    Application.ProcessMessages;
    Sleep(10);
  end;
  SetCursorPos(pt_start.x,pt_start.y);
end;

Posunutí pouze o jeden bod není nutné. Je zde jen pro efekt a to včetně použití příkazu sleep(10), které zpomalí vykonávaní přesunu tak, aby bylo něco vidět. Z příkladu je chytřejším jasné, že příkaz GetCursorPos slouží k získání aktuální pozice kurzoru, zatímco příkaz SetCursorPos slouží k pohybu kurzoru myši po obrazovce. Je však nutné si dát pozor na to, že hodnoty X a Y předávané oběma procedurám v obou případech jsou absolutní v rámci celé pracovní plochy. Nejde tedy o souřadnice v rámci vaší aplikace. Souřadnice 0,0 tedy znamenají levý horní roh obrazovky nikoli levý horní roh okna vaší aplikace.

Pohyb myši můžete také provést pomocí procedury Mouse_Event. To pak vypadá následujícím způsobem:

procedure TForm1.BitBtn4Click(Sender: TObject);
var
  pt : TPoint;
begin
  GetCursorPos(pt);

  pt.x := pt.x+50;
  pt.y := pt.y+50;
  //--- mouse absolute position ---
  pt.x := Trunc(Pt.x*(65535/screen.Width));
  pt.y := Trunc(Pt.y*(65535/screen.Height));
  //--- mouse move ---
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, pt.x, pt.y, 0, 0) ;
end;

V tomto příkladu je procedura Mouse_Event zpuštěna s parametrem MOUSEEVENTF_ABSOLUTE, který znamená, že zde musíte použít přepočet souřadnic. Levý horní roh celé pracovní plochy má souřadnice 0,0 a pravý dolní roh má souřadnice 65535,65535. Více k pohybu myši snad není nutné dodávat.

Jako další možnost, kterou můžete využít, je omezení pohybu myši ve vybrané oblasti. Pro to tyto účely je dostupná funkce ClipCursor. Nejdříve snad raději uvedu příkaz, kterým omezení myši zrušíte:

....
ClipCursor(nil);
...

Pokud někdy budete provádět omezení, !!! NIKDY !!! nezapomeňte toto nastavení zrušit. Následující příklad omezí pohyb kurzoru myši nad komponentou PanelLockMouse (TPanel): 

var
r : TRect;
begin
.....
r := PanelLockMouse.ClientRect;
r.Left := r.Left + PanelLockMouse.ClientOrigin.x;
r.Right := r.Right + PanelLockMouse.ClientOrigin.x;
r.Top := r.Top + PanelLockMouse.ClientOrigin.y;
r.Bottom := r.Bottom + PanelLockMouse.ClientOrigin.y;
ClipCursor(@r);
.....
end;

Poslední příklad, který jsem pro vás připravil, je simulace přenesení kurzoru myši nad tlačítko (name: BitBtnClick1) a zmáčknutí levého tlačítka myši. Vše je provedeno pomocí procedury Mouse_Event.

procedure TForm1.BitBtnAClick1Click(Sender: TObject);
var
  pt : TPoint;
begin
  //--- screen position ---
  pt.x := BitBtnClick1.ClientOrigin.x + trunc(BitBtnClick1.Width/2);
  pt.y := BitBtnClick1.ClientOrigin.y + trunc(BitBtnClick1.Height/2);
  //--- mouse absolute position ---
  pt.x := Trunc(Pt.x*(65535/screen.Width));
  pt.y := Trunc(Pt.y*(65535/screen.Height));
  //--- mouse move ---
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE,
              pt.x, pt.y, 0, 0) ;
  //--- left mouse button down ---
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN,
              pt.x, pt.y , 0, 0) ;
  //--- left mouse button up ---
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP,
              pt.x, Pt.y, 0, 0) ;

   Application.ProcessMessages;
end;

Všechny zde uvedené příklady jsou také použity v testovací aplikaci, kterou si můžete (včetně zdrojových kódů) stáhnout zde….. V testovací aplikaci jsou mírně složitější příklady. Jedním z příkladů může být i pohyb myši po nakreslené křivce (spíše křivici).

Ještě jedna poznámka na konec. Pokud budete používat některé ze zde uvedených technik, nezapomeňte uživateli vrátit vždy užívání myši plně pod jeho kontrolu.

Použité zdroje internet: http://delphi.about.com/ , http://www.delphipages.com/

Autor: Jiří Provazník
Datum vydání: 27.08.2007 | Zobrazeno: 7681
Permanentní odkaz: Práce s myší pro pokročilé

Komentáře (2)
Diky, dobry clanok, ja len dufam ze budem schopny spravit totalnu simulaciu uzivatela napr. drag & drop a prechod medzi A a B bude krivka - nahodne vypocitana..takze zakazdym bude ina :) Snad nieco aj z takehoto matemat. pola by sa hodilo ;-)
Autor:Fero
Sorry, 1/1 :D
Autor:Fero
Přidej vlastní komentář:
Následující (běžně neviditelná) pole slouží pro vnitřní identifikaci systému. Pokud je vyplníte nebude možné váš požadavek na straně serveru zpracovat:
URL:
contents:
Website:
Pro odeslání vašeho komentáře použijte tlačítko "Odeslat". Toto tlačítko nepoužívejte:

Následující položky je vhodné vyplnit:
Jméno :
Email :
Web :
Místo :
Hodnocení:
Hodnocení jako pomocí hvězdiček
1/5= nejhorší, 5/5=nejlepší