3.4. CBT-koukuilla seurataan fokusta ja ja aktiivisen ikkunan muutoksia

CBT tulee sanoista computer based training ja niinpä CBT-koukku on ensisijaisesti tarkoitettu tietokonepohjaiseen harjoitteluun. Sillä saa tietoa mm. aktiivisen ikkunan vaihdoksista, näppäimistöfokuksen muutoksista, ikkunan minimoinnista ja uusien ikkunoiden luonnista ja tuhoamisesta. Seuraavassa käsitellään ruudunluvun kannalta keskeiset fokuksen muutos- ja ikkunan aktivointi tapahtumat. Termi fokus tarkoittaa näppäinkäytössä aktiivista käyttöliittymäoliota, johon näppäimistöltä suoritetut komennot kohdistuvat.

Fokuksen seuraaminen (engl. focus tracking) on tehokkaan ruudunluvun perusedellytyksiä. CBT-koukkufunktio saa tiedon fokuksen muutoksesta koukkukoodin arvona HCBT_SETFOCUS. Tällöin wParam sisältää fokuksen saavan ikkunan kahvan ja lParam vastaavasti fokuksen menettävän ikkunan kahvan. Mikäli koukkufunktio palauttaa toden arvon, fokusta ei anneta wParamin osoittamalle ikkunalle. Esimerkkiohjelman cbtHook-funktiossa fokuksen muutos käsitellään seuraavalla tavalla:

if(ncode == HCBT_SETFOCUS && GetParent((HWND) wParam) != hObserver  && ((HWND) wParam != hObserver))
{ // Handle focuschange.
	lstrcat(textOut, "Focus ");
	handleControls((HWND) wParam);
	lstrcat(textOut, "\r\n");
	notifyObserver();
} // if
Ehtolauseessa varmistetaan, ettei fokuksen saanut ikkuna ole pääikkuna tai pääikkunan lapsi. Syy tähän tarkistukseen on käytännöllinen; tekstikenttä täyttyisi liian nopeasti, jos ohjelma tulostaisi tietoa myös itsestään. lstrcat on Windowsin vastine C-kielen standardikirjaston strcat-funktiolle jolla liitetään toisiinsa kaksi merkkijonoa (tai osoitinta merkkiin).

Pelkkä fokuksen seuraaminen ei riitä kaikkien merkittävien käyttöliittymätapahtumien tarkkailuun. Syitä on monia. Esimerkiksi valintaruudun tai muun kontrollin tilan muutos ei yleensä aiheuta fokuksen muutosta, koska fokus on ikkunakohtainen ja useimmat käyttöliittymäelementit ovat ikkunoita. Toisin sanoen aktiivinen ikkuna pysyy yleensä samana, vaikka käyttöliittymäelementin tila muuttuisikin. Samoin fokus ei siirry valikkoalkioiden välillä, oletettavasti siksi että valikot ovat resursseja eivätkä ikkunoita.

CBT-koukun HCBT_ACTIVATE koodi kertoo otsikkopalkillisen pääikkunan aktivoinnista. wParam on kahva aktivoitavaan ikkunaan ja lParam sisältää osoitteen lisätietoa tarjoavaan tietueeseen. Samoin kuin HCBT_SETFOCUS-koodin tapauksessa tosi paluuarvo tarkoittaa ettei ikkunaa aktivoida.

takaisin sisällysluetteloon