Image
7.6.2016 0 Comments

ASSEMBLER pod Windows: Klávesnica a myš (16. časť)

Späť na úvod >> Späť na programovanie >> Späť na seriál

Vo Windows môžete aplikácie ovládať dvoma spôsobmi: buď prostredníctvom klávesnice, alebo myši. Niekedy je potrebné v aplikácii východiskové akcie klávesnice, resp. myši zmeniť. Z toho dôvodu je vo Win32 API implementovaných niekoľko funkcií.

Typ správy

Význam

Tab. 1

WM_LBUTTONDBLCLK

Správy sa pošlú, keď používateľ urobí double-clicks (dvojklik) ľavým, stredným alebo pravým tlačidlom myši v klientskej oblasti okna.

WM_MBUTTONDBLCLK

 

WM_RBUTTONDBLCLK

 

WM_LBUTTONDOWN

Správy sa pošlú, keď používateľ stlačil ľavé, stredné alebo pravé tlačidlo myši v klientskej oblasti okna.

WM_MBUTTONDOWN

 

WM_RBUTTONDOWN

 

WM_LBUTTONUP

Správy sa pošlú, keď používateľ uvoľnil ľavé, stredné alebo pravé tlačidlo myši v klientskej oblasti okna.

WM_MBUTTONUP

 

WM_RBUTTONUP

 

Všetky správy uvedené v tabuľke 1 sa skladajú z hodnôt parametrov lParam a wParam. Parameter lParam obsahuje pozíciu kurzora. Nižšie slovo lParam obsahuje súradnicu x, vyššie slovo súradnicu y. Súradnice sa vzťahujú k ľavému hornému rohu klientskej oblasti okna. Tieto hodnoty môžete získať pomocou nasledujúceho kódu:

.data?

point POINT <>

...

mov eax,lParam

and eax,0ffffh

mov point.x,eax

mov eax,lParam

shr eax,16

mov point.y,eax

Štruktúra POINT definuje x-ovú a y-ovú súradnicu bodu takto:

POINT STRUCT

  x  DWORD ?  ;Špecifikuje x-ovú súradnicu bodu.

  y  DWORD ?  ;Špecifikuje y-ovú súradnicu bodu.

POINT ENDS

Hodnoty wParam určujú stav tlačidiel myši a klávesov SHIFT a CTRL. Tento parameter môže byť ľubovoľnou kombináciou hodnôt z tabuľky 2. Pri pohybe myši nad klientskou oblasťou okna procedúra okna dostane správu WM_MOUSEMOVE. Hodnota parametrov wParam a lParam je rovnaká ako pri správach z tabuľky 1.

 

Hodnota

Význam

Tab. 2

MK_CONTROL

Príznak je nastavený, ak je stlačený kláves CTRL.

MK_LBUTTON

Príznak je nastavený, ak je stlačené ľavé tlačidlo myši.

MK_MBUTTON

Príznak je nastavený, ak je stlačené stredné tlačidlo myši.

MK_RBUTTON

Príznak je nastavený, ak je stlačené pravé tlačidlo myši.

MK_SHIFT

Príznak je nastavený, ak je stlačený kláves SHIFT.

Správy myši generujúce sa mimo klientskej oblasti takmer zodpovedajú správam myši v klientskej oblasti. Tieto správy (pozri tabuľku 3) obsahujú navyše písmená „NC“, teda „nonclient“. Ak sa myš pohybuje mimo klientskej oblasti, procedúra okna dostane správu WM_NCMOUSEMOVE.

 

Typ správy

Význam

Tab. 3

WM_NCLBUTTONDBLCLK

Správy sa pošlú, keď používateľ urobí double-clicks (dvojklik) ľavým, stredným alebo pravým tlačidlom myši mimo klientskej oblasti okna.

WM_NCMBUTTONDBLCLK

 

WM_NCRBUTTONDBLCLK

 

WM_NCLBUTTONDOWN

Správy sa pošlú, keď používateľ stlačil ľavé, stredné alebo pravé tlačidlo myši mimo klientskej oblasti okna.

WM_NCMBUTTONDOWN

 

WM_NCRBUTTONDOWN

 

WM_NCLBUTTONUP

Správy sa pošlú, keď používateľ uvoľnil ľavé, stredné alebo pravé tlačidlo myši mimo klientskej oblasti okna.

WM_NCMBUTTONUP

 

WM_NCRBUTTONUP

 

 

Parametre wParam a lParam majú v tomto prípade trochu odlišné hodnoty. Parameter wParam označuje časť mimo klientskej oblasti okna, kam sa myš presunula. Je nastavený na jeden z identifikátorov z tabuľky 4. Parameter lParam obsahuje v nižšom slove hodnotu súradnice x a vo vyššom slove hodnotu súradnice y. Tieto súradnice nie sú súradnicami klientskej oblasti, ale obrazovkovými súradnicami. Obrazovkové súradnice môžete jednoducho previesť na klientske a naopak pomocou funkcií ScreenToClient a ClientToScreen. Ešte nám zostáva správa WM_NCHITTEST, čo znamená „nonclient hit test“. Parameter lParam obsahuje obrazovkové súradnice polohy myši x a y. Parameter wParam je nepoužitý. Aplikácie pre Windows túto správu odovzdávajú funkcii DefProcWindows. Windows potom použijú správu WM_NCHITTEST na generovanie všetkých ďalších správ myši odvodených od pozície myši. Pri správach myši z neklientskej oblasti sa hodnota vrátená (pozri tabuľku 4) funkciou DefProcWindows pri spracovaní správy WM_NCHITTEST stáva parametrom wParam správy myši.

 

Hodnota

Význam

Tab. 4

HTBORDER

Okraj okna, pri ktorom nie možné meniť veľkosť

HTBOTTOM

Spodný horizontálny okraj okna

HTBOTTOMLEFT

Ľavý spodný roh rámu okna

HTBOTTOMRIGHT

Pravý spodný roh rámu okna

HTCAPTION

Titulok okna

HTCLIENT

Klientska oblasť

HTERROR

Prinúti procedúru DefProcWindow, aby pípla

HTGROWBOX

Veľkosť rámu (podobné HTSIZE)

HTHELP

Tlačidlo help

HTHSCROLL

Horizontálny scroll bar

HTLEFT

Ľavý okraj okna

HTMENU

Menu

HTMAXBUTTON

Tlačidlo Maximize

HTMINBUTTON

Tlačidlo Minimize

HTNOWHERE

Žiadne okno

HTREDUCE

Tlačidlo Minimize

HTRIGHT

Prvý okraj okna

HTSIZE

Veľkosť rámu (podobné HTGROWBOX)

HTSYSMENU

Systémové  menu alebo tlačidlo Close

HTTOP

Horný horizontálny okraj okna

HTTOPLEFT

Ľavý horný roh rámu okna

HTTOPRIGHT

Pravý horný roh rámu okna

HTTRANSPARENT

Aktuálne okno prekryté iným oknom

HTVSCROLL

Vertikálny scroll bar

HTZOOM

Tlačidlo Maximize

 

ClientToScreen

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia prevedie súradnice bodu vztiahnuté ku klientskej oblasti na súradnice vzťahujúce sa k ľavému hornému rohu obrazovky.

Syntax: BOOL ClientToScreen, HWND hWnd,  LPPOINT lpPoint

HWND hWnd: Identifikuje handle okna, ktorého klientska oblasť sa použije na prevod.

LPPOINT lpPoint: Ukazovateľ na štruktúru POINT, ktorá obsahuje klientske súradnice, ktoré sa majú previesť. Ak funkcia vráti TRUE, do tejto štruktúry sa skopírujú nové obrazovkové súradnice.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak FALSE.

 

ScreenToClient

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Funkcia prevedie obrazovkové súradnice zo štruktúry POINT na klientske súradnice.

Syntax: BOOL ScreenToClient, HWND hWnd,  LPPOINT lpPoint

HWND hWnd: Identifikuje handle okna, ktorého klientska oblasť sa použije na prevod.

LPPOINT lpPoint: Ukazovateľ na štruktúru POINT, ktorá obsahuje obrazovkové súradnice, ktoré sa majú previesť.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak FALSE.

Klávesnica vo Windows predstavuje ďalší štandardný prostriedok na zadávanie vstupu od používateľa. Windows oznamuje aplikácii stlačenie klávesov posielaním správ (pozri obrázok 1). Najbežnejšie správy nájdete v tabuľke 5. Keď stlačíte kláves, uloží Windows správu WM_KEYDOWN alebo WM_SYSKEYDOWN do frontu správ okna, ktoré má vstupný focus (zameranie). Po uvoľnení klávesu zase Windows zaradí do frontu správy WM_KEYUP a WM_SYSKEYUP. Správy WM_SYSKEYDOWN a WM_SYSKEYUP sa obyčajne generujú pre klávesy stlačené v kombinácii s klávesom ALT. Pri týchto štyroch správach parameter wParam obsahuje virtuálny kód klávesu a lParam obsahuje ďalšie dáta vzťahujúce sa k stlačeniu klávesu. Virtuálne kódy klávesov sa začínajú písmenami VK, napr. VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN a pod. Tabuľku virtuálnych kódov klávesov nájdete na stránke www.pcrevue.sk v sekcii Programujeme › Assembler pod Windows. Parameter lParam pri správach (WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP) obsahuje ďalšie informácie (pozri obrázok 2) potrebné na analýzu stlačenia klávesu.

Hodnota

Význam

Tab. 5

WM_KEYDOWN

Bol stlačený kláves

WM_KEYUP

Bol uvoľnený kláves

WM_CHAR

Obsahuje znakový kód stlačeného klávesu

WM_SYSKEYDOWN

Bol stlačený kláves pri súčasnom stlačení klávesu ALT

WM_SYSKEYUP

Bol uvoľnený kláves pri súčasnom stlačení klávesu ALT

WM_SYSCHAR

Obsahuje znakový kód stlačeného klávesu pri súčasnom stlačení klávesu ATL

WM_KILLFOCUS

Klávesnica stratila focus (zameranie)

WM_SETFOCUS

Klávesnica získala focus (zameranie)

 

Key Repeat Count (16-bitový počet opakovaní klávesu) – táto hodnota je obyčajne nastavená na 1. Pokiaľ je však kláves stlačený dlhšie a procedúra vášho okna nie je dostatočne rýchla na to, aby spracúvala správy klávesov rýchlosťou, s akou sa kláves opakuje, Windows zlúči niekoľko správ  WM_KEYDOWN alebo WM_SYSKEYDOWN do jedinej správy a zvýši položku počtu opakovaní na príslušnú hodnotu. Pri správach WM_KEYUP a WM_SYSKEYUP je počet opakovaní vždy 1.

Scan code (8-bitový snímací kód OEM) – je generovaný hardvérom klávesnice. Skratka OEM znamená Original Equipment Manufactures. Programy môžu tento kód ignorovať.

Extended-key flag (príznak rozšíreného klávesu) – má hodnotu 1, pokiaľ je stlačenie klávesu výsledkom stlačenia jedného z dodatočných klávesov na rozšírenej klávesnici IBM (rozšírená klávesnica má 101 alebo 102 klávesov). Funkčné klávesy sú v rade hore. Klávesy na pohyb kurzora sú oddelené od numerickej klávesnice, ale tieto číselné klávesy tiež môžu duplikovať klávesy na pohyb kurzora. Tento príznak je nastavený na 1 pri klávesoch ALT a CTRL na pravej strane klávesnice, pri klávesoch na pohyb kurzora (vrátane klávesov INSERT a DELETE), ktoré nie sú súčasťou numerickej klávesnice, pri klávese „/“ a klávese ENTER a takisto pri klávese NUM LOCK. Tento príznak môžu programy tiež ignorovať.

Context code (kontextový kód) – je 1, pokiaľ je kláves ALT stlačený počas stlačenia iného klávesu. Tento bit bude vždy 1 pri správach WM_SYSKEYUP a WM_SYSKEYDOWN a 0 pri správach WM_KEYUP a WM_KEYDOWN. Existujú však dve výnimky: 1. Ak je aktívne okno minimalizované, nemá vstupný focus. Všetky stlačenia klávesov generujú WM_SYSKEYUP a WM_SYSKEYDOWN. Pokiaľ kláves ALT nie je stlačený, položka kontextového kódu je nastavená na nulu. Windows používa správy WM_SYSKEYUP a WM_SYSKEYDOWN na to, aby minimalizované okno nespracúvalo tieto stlačenia klávesov. 2. Na niektorých cudzojazyčných klávesniciach sa niektoré znaky generujú kombináciou klávesov SHIFT, CTRL alebo ALT spolu s ďalším klávesom. V týchto prípadoch je kontextový kód nastavený na 1, ale posielané správy nie sú správami systémových stlačení klávesov.

Previous key-state flag (predchádzajúci stav klávesu) – je nula v prípade, že kláves bol predtým uvoľnený, a 1, keď bol predtým stlačený. Pre správy WM_KEYUP a WM_SYSKEYUP je vždy nastavený na 1, pri správach WM_KEYDOWN a WM_SYSKEYDOWN môže byť hodnota flagu 0 alebo 1. Hodnota 1 vyjadruje, že ide o druhú alebo ďalšie správy, ktoré sú výsledkom automatického opakovania.

Transition-state flag (prechodový stav) je nula, keď je kláves práve stlačený, a 1, keď je práve uvoľnený. Pri správach WM_KEYDOWN a WM_SYSKEYDOWN je táto položka nastavená na 0 a pri správach WM_KEYUP a WM_SYSKEYUP je nastavená na 1.

ActivateKeyboardLayout

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Nie

user32.lib

user32.inc

Funkcia aktivuje iné rozloženie klávesnice pre aktuálne vlákno.

Syntax: HKL ActivateKeyboardLayout, HKL hkl, UINT Flags

HKL hkl: Rozloženie klávesnice, ktoré sa má aktivovať. Rozloženie klávesnice však musí byť umiestnené do pamäte predchádzajúcim volaním funkcie LoadKeyboardLayout. Tento parameter môže byť handle na rozloženie klávesnice alebo jedna z nasledujúcich hodnôt: HKL_NEXT – vyberá nasledujúce rozloženie klávesnice, spravované Windows; HKL_PREVIOUS – vyberá predchádzajúce rozloženie klávesnice, spravované Windows.

UINT Flags: Špecifikuje, ako má byť rozloženie klávesnice aktivované. Tento parameter môže byť  jedna z nasledujúcich hodnôt: KLF_REORDER – systémový zoznam rozložení klávesníc je aktualizovaný. Ak používateľ má aktívne napr. anglické rozloženie klávesnice a pritom má zavedené francúzske, nemecké a španielske rozloženie (v tomto poradí), potom vybranie nemeckého rozloženia s nastaveným bitom KLF_REORDER by vyprodukovalo nasledujúce poradie: nemecké, anglické, francúzske, španielske. Vybranie nemeckého rozloženia klávesnice bez nastaveného bitu KLF_REORDER by vyprodukovalo nasledujúce poradie: nemecké, španielske, anglické a francúzske; KLF_UNLOADPREVIOUS – predtým aktívne rozloženie klávesnice je odstránené z pamäte.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak FALSE.

Použitie uvedených funkcií nájdete v príklade na stránke www.pcrevue.sk v sekcii Programujeme – Assembler pod Windows.

Literatúra

[1]  Simon, R. J. – Gouker, M. – Barnes, B. C.: Win32 API. Zväzok 1, 2, 3. UNIS publishing, Brno 1997.

[2]  Richter, J.: Windows pro pokročilé a experty. Computer Press, Praha 1997.

[3]  Petzold, Ch.: Programovaní ve Windows – Win32 API. Computer Press, Praha 1999.


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 1

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Ako na to 3

Ako na to: Ochranná fólia versus tvrdené sklo? Čo je lepšie pre smartfón?

25.11.2016 00:16

Pomôže mobilu ďalšia vrstva ochrany alebo nie? Stačí klasická – plastová fólia alebo je tvrdené sklo tá lepšia voľba? Všetci dobre vieme, ako ľahko sa dokážu moderné smartphony doškriabať – či už pria ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá