Masa rykova un iverz ita Fakulta informatiky Studijní obor: Počítačová grafika
TVORBA CHARAKTERU PRO POČÍTAČOVOU HRU NOVÉ GENERACE Creating the Character for the Next Generation Computer Game Diplomová práce
Vedoucí diplomové práce:
Autor:
MgA. Helena Lukášová, ArtD.
Bc. Vít BLECHA
Brno, 2015
J mé no a p ř í j mení aut or a:
Vít Blecha
Ná z e v di pl omové pr áce:
Tvorba charakteru pro počítačovou hru nové generace
Ná z e v pr áce v angličt i ně:
Creating the Character for the Next Generation Computer Game
Ka t e dr a:
Katedra počítačové grafiky a designu
Ve doucí di pl omové pr áce:
MgA. Helena Lukášová, ArtD.
Rok obhaj oby:
2015
Anotace Práce se zabývá moţností zpracování klávesového vstupu v systému Windows, která umoţňuje identifikovat klávesnici pouţitou pro daný vstup a současně má moţnost daný vstup zablokovat (zabránit jeho zaznamenání aktivní aplikací). V praktické části práce je vytvořen nástroj, který umoţňuje nastavení klávesových zkratek pro více současně připojených klávesnic.
Annotation The thesis focuses on the possibility of processing keyboard input in Windows operating system, which would allow identification of the keyboard used for the input, and simultaneously be able to block the keyboard input (don’t allow the active application to receive the input). For the practical part of the thesis the tool is developed which allows users to set up hotkeys for multiple keyboards connected to the computer.
Klíčová slova Klávesové zkratky, klávesnice, rozpoznání více klávesnic, zpracování klávesového vstupu.
Keywords Hotkeys, keyboards, identification of multiple keyboards, processing of the keyboard input.
Prohlášení Prohlašuji, ţe tato práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování pouţíval nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. V Brně dne 8. ledna 2015 vlastnoruční podpis autora
OBSAH OBSAH ......................................................................................................................................4 ÚVOD .........................................................................................................................................5 1
MOTIVACE PRO VZNIK LITEKEYS ..........................................................................6
2
ZPRACOVÁNÍ KLÁVESOVÉHO VSTUPU .................................................................7 2.1 METODY ZPRACOVÁNÍ VSTUPU NA ÚROVNI JÁDRA .........................................................7 2.2 METODY ZPRACOVÁNÍ VSTUPU NA APLIKAČNÍ ÚROVNI ..................................................7 2.2.1 Raw Input ................................................................................................................7 2.2.2 Hook........................................................................................................................7
3
KOMBINOVÁNÍ RAW INPUT A KEYBOARD HOOK ..............................................8 3.1 ZAKLÁDNÍ PRINCIP .........................................................................................................8 3.2 NEJDŮLEŢITĚJŠÍ PROTIOPATŘENÍ ....................................................................................9 3.2.1 Ukládání Raw Input rozhodnutí ..............................................................................9 3.2.2 Chybějící Keyboard Hook zpráva...........................................................................9 3.2.3 Čekání na Raw Input zprávu ...................................................................................9 3.2.4 Chybějící Raw Input zpráva .................................................................................10 3.3 PŘEDCHÁZENÍ PROBLÉMŮM ..........................................................................................10 3.3.1 Klávesa AltGr .......................................................................................................10 3.3.2 Nesmyslné Keyboard Hook události ....................................................................10 3.3.3 Opakované Keyboard Hook události ....................................................................10 3.3.4 Speciální klávesy ..................................................................................................11
4
REALIZACE LITEKEYS...............................................................................................11
ZÁVĚR ....................................................................................................................................12 SEZNAM POUŽITÝCH ZDROJŮ .......................................................................................13 SEZNAM ELEKTRONICKÝCH PŘÍLOH ........................................................................14
ÚVOD Moje diplomová práce se měla skládat ze dvou poměrně odlišných částí. Výtvarná část práce měla být věnována tvorbě charakteru pro počítačovou hru. Bohuţel jsem však tuto část práce nestihl vůbec vypracovat. Veškerý čas jsem totiţ věnoval informatické části práce, jejíţ náplní je návrh a realizace programu pro správu klávesových zkratek, který umí vyuţít více klávesnic připojených k počítači. V teoretické části práce popíšu způsob, který umoţňuje při zpracování klávesové události v systému Windows identifikovat klávesnici, která byla pro vstup pouţita, a současně umí tento vstup zablokovat (zabránit tomu, aby aplikace, které je vstup původně adresován, tento vstup zaznamenala). Postup vyuţívá kombinaci rozhraní Raw Input a mechanismu Keyboard Hook, která nebyla nikde zdokumentována. Bylo proto velmi obtíţné najít informace, které mě k řešení tohoto problému navedly. Z tohoto důvodu jsem se rozhodl, přestoţe základní princip řešení není mým originálním dílem, ţe jedním z cílů mé práce bude tento postup zdokumentovat a zveřejnit. Aby případně další vývojáři, kteří na tento problém narazí, mohli snáze najít řešení. Stěţejní je však praktická část práce, v rámci které jsem vytvořil program LiteKeys. Tento nástroj pro správu klávesových zkratek umoţňuje přiřazovat funkci jednotlivým klávesám na několika klávesnicích, současně připojených k počítači. Díky tomu je moţné nastavit klávesnici, která bude slouţit pro spouštění klávesových zkratek, a funkce hlavní klávesnice zůstane zachována pro standardní klávesový vstup. Cílem tohoto řešení je zlepšit ergonomii práce, zvlášť při pouţívání grafického tabletu.
1 MOTIVACE PRO VZNIK LITEKEYS Grafický tablet je velice uţitečný nástroj pro širokou řadu grafických projektů. Jako zjevný příklad bych uvedl digitální malbu. Osobně tablet často pouţívám. Avšak při delší práci s ním jsem začal pociťovat únavu levé ruky, kterou mačkám klávesové zkratky. Jsem přesvědčen, ţe je to do jisté míry způsobeno špatnou ergonomií práce. Tablet totiţ na stole zabírá poměrně hodně místa a klávesnice musí být posunutá více dozadu. Musím mít proto nataţenou ruku, abych na klávesnici dosáhl. To není zcela v souladu se správným drţením těla pro prevenci RSI [1]. Začal jsem proto hledat způsob, jak toto uspořádání vylepšit, protoţe klávesové zkratky jsou důleţité pro efektivní práci. Bylo mi doporučeno zařízení Razer Nostromo (respektive nové modely Razer Orbweaver nebo Tartarus), coţ je v podstatě malá klávesnice s programovatelnými klávesami. Tato klávesnice by zřejmě poskytovala ideální řešení, protoţe by mohla být umístěna vedle tabletu v pohodlném dosahu. Nevýhodou tohoto zařízení je však jeho poměrně vysoká cena (levnější model Razer Tartarus se prodává přibliţně za 1800 Kč). Při hledání levnější varianty mě napadlo, zda by tuto funkci mohla zastat obyčejná numerická klávesnice (jejichţ ceny se pohybují okolo 100 - 200 Kč). Pro to jsem potřeboval najít software pro operační systém Windows, který by umoţňoval nastavit klávesové zkratky pro tuto klávesnici. Pouze přiřadit klávesové zkratky různých aplikací vybraným klávesám (za předpokladu, ţe by to bylo v dané aplikaci vůbec moţné) nebo nastavit obecně klávesové zkratky na tyto klávesy pro všechny klávesnice by bylo nevyhovující, protoţe by to znemoţnilo pouţívat tyto klávesy na hlavní klávesnici pro zadávání číselných hodnot. Takový software, který by odpovídal mým poţadavkům, se mi podařilo najít pouze jeden a to Quick Macros [2]. Jedná se však o software licencovaný (s cenou 60 USD). Celkové náklady na toto řešení by se tedy blíţily ceně specializované klávesnice. Navíc program působí dojmem, ţe jeho nastavování je poměrně komplikované (je to však opravdu pouze můj dojem, neboť jsem toto řešení zavrhl kvůli ceně a nezkoušel jsem s programem pracovat). Jediný další software, který umoţňuje nastavit klávesové zkratky pro konkrétní klávesnice, co se mi podařil najít, je HID macros [3]. Tento software je dostupný zdarma, má však jeden zásadní nedostatek. Neumoţňuje totiţ nastavit rozdílné klávesové zkratky pro různé aplikace. Vzhledem k tomu, ţe je běţné pracovat s více aplikacemi, by bylo nastavování takových obecně platných klávesových zkratek značně komplikované. Tento nedostatek je moţné obejít pouţitím dalšího programu pro správu klávesových zkratek, který umí rozlišovat aktivní aplikace, jako je například AutoHotkey [4]. Spouštění klávesových zkratek pak funguje tak, ţe nejprve HID macros určí, na které klávesnici byla klávesa zmáčknuta a nasimuluje místo ní stisk jiné speciální klávesy. Tuto speciální klávesu zachytí AutoHotkey a vykoná patřičnou akci pro aktivní aplikaci. Tento postup je neefektivní, protoţe pro kaţdou klávesovou zkratku musí být simulována klávesová událost navíc. Další nevýhodou je to, ţe nastavovat dva programy současně není zrovna pohodlné. Navíc nastavování AutoHotkey se velice blíţí programování ve skriptovacím jazyku, coţ můţe být pro některé grafiky, kteří nemají s programováním zkušenosti, odrazující. Vzhledem k tomu, ţe se mi nepodařilo najít vhodné dostupné řešení, rozhodl jsem se takový software sám vytvořit, protoţe věřím, ţe můţe spoustě grafiků usnadnit práci. Měl by umoţnit přiřazení klávesových zkratek pro konkrétní klávesnici a konkrétní aplikaci. Také by měl být jednoduše nastavitelný.
2 ZPRACOVÁNÍ KLÁVESOVÉHO VSTUPU Pro návrh programu pro správu klávesových zkratek, který jsem nastínil v předchozí kapitole, je zcela zásadní to, jakým způsobem bude zpracovávat klávesové události. Systém Windows nabízí několik moţností, jak pracovat s klávesovým vstupem. Ty je moţné na základě článku [5] rozdělit do dvou hlavních kategorií.
2.1 Metody zpracování vstupu na úrovni jádra Tyto metody vesměs obnáší tvorbu nebo úpravu ovladačů klávesnic. Pravděpodobně nejvhodnější pro moje účely by byl Keyboard Class Filter Driver, který by upravoval funkci všech klávesnic. Nicméně nemám s tvorbou ovladačů ţádné zkušenosti a tento postup se mi zdál poměrně sloţitý. Alternativní řešení by bylo pouţít knihovnu Interception [6], která nabízí takový ovladač s programovacím rozhraním prostřednictvím knihovny. Problém však je v tom, ţe zdrojový kód tohoto ovladače není dostupný. Neměl bych tedy moţnost ověřit, zda neobsahuje nějaký potencionálně škodlivý kód. Další nevýhodou těchto metod obecně je nutnost instalace daného ovladače, coţ by omezilo přenositelnost.
2.2 Metody zpracování vstupu na aplikační úrovni Těchto metod je k dispozici několik a výrazně se liší v tom, co všechno dokáţou s klávesovým vstupem udělat. Pro můj navrhovaný program jsou důleţité dva poţadavky. Schopnost rozpoznat klávesnici, která byla pro daný vstup pouţitá, jelikoţ to má být jedna z hlavních vlastností tohoto programu. Zadruhé schopnost daný klávesový vstup zablokovat, tedy zabránit tomu, aby klávesová událost byla zaznamenána aktivní aplikací. To je důleţité z toho důvodu, aby se klávesový vstup neprojevil v aktivní aplikaci, kdyţ klávesa spustí nějakou klávesovou zkratku. A protoţe to, zda klávesa spustí nějakou klávesovou zkratku, můţe záviset na pouţité klávesnici, musí být tyto poţadavky splněny současně. S přihlédnutím k tomuto jsou z metod zpracovávání vstupu na aplikační úrovni zajímavé následující dvě moţnosti. 2.2.1
Raw Input
Toto rozhraní poskytuje moţnosti pro zpracování událostí z různých vstupních zařízení, mimo jiné i z klávesnic. Umoţňuje vstupní zařízení identifikovat, je tedy moţné pomocí tohoto rozhraní určovat, která klávesnice byla pouţita pro daný vstup. Druhý poţadavek však toto rozhraní nesplňuje, protoţe neumí klávesové vstupy blokovat. 2.2.2
Hook
Hook je mechanismus, který umoţňuje programu zachytávat různé události v systému, včetně událostí souvisejících s klávesovým vstupem. Pro to jsou nejvhodnější typy Keyboard Hook (WH_KEYBOARD) a Low Level Keyboard Hook (WH_KEYBOARD_LL). Takto zachycené události je moţné blokovat a zabránit tak tomu, aby je systém dál šířil a zpracovával. Pomocí tohoto mechanismu však není pro klávesové události moţné určit, na které klávesnici byly klávesy stisknuty. Ţádná z metod zpracování vstupu na aplikační úrovni nesplňuje oba poţadavky. Kdyţ jsem hledal moţnosti, jak tento problém obejít, našel jsem příspěvek v diskusi od Petra Medka, autora programu HID macros [3]. Naznačoval, ţe je moţné výše uvedené metody zkombinovat. Daný postup se mi nepodařilo najít v ţádné oficiální dokumentaci, ani v jiných zdrojích. Poradil jsem se proto s autorem a poţádal o jeho svolení tento postup pouţít pro svůj program a veřejně jej zdokumentovat, s čímţ pan Medek souhlasil.
3 KOMBINOVÁNÍ RAW INPUT A KEYBOARD HOOK Jak jsem uvedl v minulé kapitole, kombinace rozhraní Raw Input a mechanismu Keyboard Hook je jedinou moţností, kterou se mi podařilo najít, jak rozpoznat klávesnici pouţitou pro klávesovou událost a současně mít moţnost tuto událost zablokovat, aniţ by bylo nutné pracovat s ovladači. Neboť tento postup nebyl doposud nikde zdokumentován a povaţoval jsem ho za potencionálně uţitečný pro další vývojáře, rozhodl jsem se jeho popisu věnovat teoretickou část svojí diplomové práce. Budu zde popisovat pouze teoretické základy daného postupu. Celý postup jsem však sepsal i formou podrobnějšího návodu, včetně ukázek kódu, který je dostupný online [7]. Se základním principem tohoto postupu mě obeznámil Petr Medek [3]. Další testování a návrhy řešení objevených problémů jsem však jiţ většinou zpracovával sám.
3.1 Zakládní princip Podstatou této metody je pouţít rozhraní Raw Input pro identifikování klávesnice dané klávesové události, na základě čehoţ se rozhodne, zda má být tato klávesová událost zablokována. Samotné zablokování provádí pak mechanismus Keyboard Hook. V první řadě je tedy potřeba připravit rozhraní Raw Input a mechanismus Keyboard Hook. V případě Raw Input je to poměrně jednoduché [8], stačí se přihlásit pro odběr zpráv daného zařízení pro všechna okna aplikací. Program poté bude dostávat zprávy WM_INPUT pro kaţdou klávesovou událost. Nastavení Hook mechanismu je o něco sloţitější. Je totiţ nutné pouţít typ Keyboard Hook (WH_KEYBOARD) [9], který musí být umístěn v dynamicky linkované knihovně, aby fungoval v ostatních aplikacích (a ne pouze pro program samotný). Pro postup jak takovou knihovnu vytvořit můţu doporučit článek [10] (autor v příkladu pracuje s myší, nicméně postup pro klávesnici je velmi podobný). Pro tento účel není moţné pouţít mechanismus Low Level Keyboard Hook (WH_KEYBOARD_LL), který by nemusel být umístěn v dynamicky linkované knihovně. Ale jeho zpracování probíhá ještě předtím, neţ systém zasílá zprávy pro Raw Input rozhraní, a tak není moţné je kombinovat. Keyboard Hook mechanismus funguje tak, ţe kdyţ nastane příslušná událost (stisk klávesy), systém zavolá zvolenou proceduru. Podle hodnoty, kterou tato procedura vrátí, pak buď událost dále zpracovává, nebo její šíření zastaví. Pro to, aby Keyboard Hook mechanismus mohl vyuţít rozhodnutí, zda danou klávesovou událost blokovat či nikoliv, musí komunikovat s řídícím programem, který zpracovává zprávy rozhraní Raw Input. K tomu je moţné pouţít zaslání zprávy prostřednictvím funkce SendMessage. Řídící program pro tuto zprávu vrátí hodnotu, která určí, zda má mechanismus Keyboard Hook událost zablokovat. Řídící program tedy dostává dva typy zpráv. Zprávy WM_INPUT pro Raw Input rozhraní, ze kterých je moţné určit, která klávesnice byla pro daný vstup pouţita, a na základě toho rozhodnout, zda tato událost má být zablokována. A zprávy, které zasílá procedura Keyboard Hook mechanismu, umoţňující zvolením odpovídající vrácené hodnoty danou událost zablokovat, nebo nechat systém, aby ji předal aktivní aplikaci. V ideálním případě, kdy řídící program obdrţí vţdy zprávu Raw Input rozhraní následovanou zprávou pro Keyboard Hook mechanismus dané klávesové události, by stačilo pro tuto zprávu vrátit hodnotu určenou při zpracování oné poslední Raw Input zprávy. To je ale bohuţel pouze ideální scénář, který při běţném provozu velmi často neplatí. Z tohoto důvodu je nutné zavést různá protiopatření, která případné problematické situace řeší.
3.2 Nejdůležitější protiopatření Jak jsem výše předeslal, řídící program ne vţdy obdrţí zprávy v ideálním pořadí. Uvedu zde jednotlivé problémové situace, o kterých z testování vím, ţe mohou nastat, a návrh postupu, jak tyto situace řešit. 3.2.1
Ukládání Raw Input rozhodnutí
Při rychlém sledu klávesových událostí se často stává, ţe řídící program obdrţí více zpráv Raw Input rozhraní a aţ poté odpovídající zprávy pro Keyboard Hook mechanismus. Není tedy moţné pouţívat rozhodnutí, zda událost blokovat či nikoliv, pouze na základě poslední zpracované Raw Input zprávy. Místo toho je nutné při zpracování Raw Input zprávy, určit, jestli má být tato událost zablokována, a toto rozhodnutí uloţit do fronty v paměti. Poté je pro příchozí Keyboard Hook události patřičné rozhodnutí vytaţeno z této fronty. 3.2.2
Chybějící Keyboard Hook zpráva
Můţe se stát, ţe pro některé klávesové události řídící program vůbec neobdrţí Keyboard Hook zprávu, ale obdrţí pro ni Raw Input zprávu. S touto situací se setkávám například při pouţití klávesové zkratky Ctrl + Esc. Chybějící zpráva Keyboard Hook by způsobila, ţe rozhodnutí, která program ukládá při zpracování Raw Input zpráv, by přestaly odpovídat Keyboard Hook zprávám. Rozhodnutí pro chybějící Keyboard Hook zprávu je totiţ uloţeno do fronty, ale pouţije jej aţ následující Keyboard Hook událost. Tento posun by se pak projevil pro kaţdou další událost. Moţným řešením tohoto problému je ukládat do fronty ne pouze samotné rozhodnutí, ale také virtuální kód klávesy (a případně i příznak stisku nebo uvolnění klávesy) události, pro kterou je rozhodnutí určeno. Pro příchozí zprávy Keyboard Hook procedury je pak vţdy pouţito rozhodnutí pro odpovídající virtuální kód klávesy. Kdyţ je při výběru z fronty nějaké rozhodnutí přeskočeno, je z fronty rovnou odstraněno, aby nebylo později pouţito pro nesprávnou klávesovou událost. Lze totiţ předpokládat, ţe pro toto přeskočené rozhodnutí bude Keyboard Hook zpráva chybět. Během testování jsem se nesetkal s případem, ţe by bylo pořadí zpráv prohozeno (tedy například ţe by program obdrţel zprávy Raw Input rozhraní pro klávesy v pořadí A a B a zprávy Keyboard Hook v pořadí B a A). Tento předpoklad by neplatil také pro situaci, kdy by chyběla zpráva pro Raw Input rozhraní. To je však samo o sobě závaţný problém, o kterém budu psát podrobněji níţ. K nepřesnému zpracování vlivem chybějící Keyboard Hook zprávy stále můţe dojít, kdyţ po sobě následují dvě klávesové události stejné klávesy, z nichţ jedna má být blokována a druhá ne. Tuto situaci se mi nepodařilo nijak uspokojivě řešit, nicméně se jedná o velmi okrajový případ. 3.2.3
Čekání na Raw Input zprávu
Většinou platí, ţe řídící program obdrţí pro danou klávesovou událost nejprve zprávu Raw Input rozhraní a poté zprávu od Keyboard Hook procedury. To znamená, ţe při zpracování Keyboard Hook zprávy byla jiţ Raw Input zpráva zpracována a rozhodnutí pro danou klávesovou událost je jiţ připraveno ve frontě a můţe být okamţitě pouţito. Můţe se však stát, ţe programu přijde jako první zpráva Keyboard Hook. V takovém případě nebude při jejím zpracování ve frontě nalezeno odpovídající rozhodnutí. Program tak musí čekat s odpovědí na Keyboard Hook zprávu, neţ mu daná zpráva Raw Input přijde. Pro kontrolování příchozích zpráv je moţné pouţít funkci PeekMessage.
3.2.4
Chybějící Raw Input zpráva
Vzhledem k tomu, ţe je moţné, ţe pro některé události obdrţí řídící program pouze zprávu Keyboard Hook a nikoliv zprávu od Raw Input rozhraní, je nutné omezit dobu, po kterou řídící aplikace čeká na odpovídající Raw Input událost. Po uplynutí této doby je čekání ukončeno s tím, ţe pro danou klávesovou událost není moţné získat patřičné rozhodnutí. K tomuto dochází například při stisku klávesy Windows (s aktivním českým QWERTZ rozloţením klávesnice), kdy program obdrţí navíc událost Keyboard Hook pro klávesu Ctrl. Chybějící nebo opoţděné Raw Input zprávy povaţuji za největší problém tohoto řešení, neboť čekání na odpovídající Raw Input zprávu se projeví zdrţením zpracování klávesového vstupu, coţ můţe být citelné. Naštěstí je moţné některým situacím, které se takto projevují, předcházet (viz níţ).
3.3 Předcházení problémům Je několik situací, při kterých dochází k výše zmíněnému problému s chybějící zprávou Raw Input. V těchto případech, které se chovají předvídatelně, je však moţné potencionálním problémům předcházet. 3.3.1
Klávesa AltGr
Pro některá rozloţení klávesnice je klávesa AltGr interpretována systémem jako kombinace kláves Ctrl + Alt. To se projeví tak, ţe řídícímu programu přijdou zprávy od Keyboard Hook procedury pro klávesy Ctrl a Alt. Zprávu pro Raw Input obdrţí program však pouze jednu a to pro klávesu Alt. Tuto situaci je moţné řešit při zpracovávání této Alt Raw Input zprávy tím, ţe program vloţí rozhodnutí do fronty nejen pro onu klávesu Alt, ale také rozhodnutí pro klávesu Ctrl. Tak bude při zpracování Keyboard Hook zpráv nalezeno rozhodnutí pro obě klávesy. 3.3.2
Nesmyslné Keyboard Hook události
Při stisku některých kláves zaznamenává Keyboard Hook mechanismus jisté nadbytečné události. Například při stisku jiţ zmíněné klávesy Windows dostane řídící program navíc Keyboard Hook zprávu pro klávesu Ctrl. Při prozkoumání této události je moţné zjistit, ţe má nastavené příznaky, které říkají, ţe klávesa je uvolňována (Transition-State Flag) a ţe před touto událostí byla klávesa nestisknutá (Previous Key-State Flag). Tato kombinace příznaků je pro skutečnou klávesovou událost nesmyslná. Je proto moţné nastavit, aby zpracovávání Keyboard Hook zpráv tyto události ignorovalo a nečekalo tak zbytečně na zprávu Raw Input, která by nepřišla. Jediná klávesa, která se během mého testování takto nesmyslně objevovala, byla klávesa Ctrl. 3.3.3
Opakované Keyboard Hook události
V některých situacích se stává, ţe Keyboard Hook mechanismus dostává několik stejných událostí po sobě pro jediný skutečný klávesový vstup. Například k tomu můţe dojít, kdyţ aplikace přejde do menu. V některých aplikacích k tomu dochází i méně předvídatelně. Kaţdá takto opakovaná událost se snaţí čekat na příchozí zprávu Raw Input, kterou však program obdrţí pouze jednu pro kaţdý skutečný klávesový vstup. Tomu se dá předejít tak, ţe si řídící program bude zaznamenávat poslední zpracovanou Keyboard Hook zprávu a pokud následně obdrţí další stejnou zprávu, pouţije pro ni i stejné rozhodnutí za předpokladu, ţe není ţádné rozhodnutí pro tuto událost uloţeno ve frontě (opakované Keyboard Hook zprávy mohou být i ţádoucí, například při drţení klávesy stisknuté).
3.3.4
Speciální klávesy
Určité klávesy, které mají nějakou speciální funkci, jako například klávesa Kalkulačka, není moţné zablokovat pomocí mechanismu Keyboard Hook. Pro jejich blokování je třeba pouţít Low Level Keyboard Hook, důsledkem čehoţ není moţné rozpoznat klávesnici, na které byla klávesa zmáčknuta.
4 REALIZACE LITEKEYS Pro implementaci nástroje LiteKeys jsem se rozhodl pouţít jazyk C++, protoţe s ním mám největší zkušenosti a navíc nabízí pohodlnou práci s rozhraním Windows, ať uţ pro Raw Input nebo Keyboard Hook mechanismus. Chtěl jsem, aby byl nástroj v praxi co moţná nejméně náročný, rozhodl jsem se ho proto rozdělit do dvou aplikací. Program LiteKeys řídí zpracování klávesových událostí a spouštění klávesových zkratek. Dal by se přirovnat ke sluţbě, která běţí na pozadí systému. Má proto pouze minimální uţivatelské rozhraní v podobě ikony v oznamovací oblasti (pravá část hlavního panelu). Oproti tomu program LiteKeys Nastavení nabízí plně grafické uţivatelské rozhraní, které slouţí pro pohodlné nastavování klávesových zkratek a všech dalších funkcí nástroje. Tento program jsem vytvořil pomocí knihovny pro tvorbu uţivatelských rozhraní Qt [11], kterou mohu doporučit. Obě komponenty vyuţívají pro ukládání a načítání nastavení XML soubory, které zpracovávám pomocí knihovny pugixml Arsenyho Kapoulkineho [12].
ZÁVĚR V rámci informatické části svojí práce jsem zdokumentoval postup, jakým je moţné při zpracování klávesových událostí identifikovat klávesnici daného vstupu a zároveň mít moţnost tento vstup zablokovat. Protoţe jsem si dal za cíl tento postup zveřejnit pro další vývojáře, sepsal jsem tento postup v článku, který je dostupný online [7]. Článek jiţ shlédlo přes deset tisíc lidí a dostává poměrně vysoké hodnocení. Vytvořil jsem nástroj LiteKeys, který umoţňuje přiřazovat klávesové zkratky několika současně připojeným klávesnicím. Vzhledem k tomu, ţe mi vývoj zabral mnohem víc času, neţ jsem plánoval (přibliţně rok), zveřejnil jsem tento nástroj teprve krátce před odevzdáním práce. Nemám tedy zatím ţádná data od skutečných uţivatelů, ze kterých bych mohl objektivně hodnotit jeho uţitečnost. Mohu nabídnout pouze svoje osobní zkušenosti, které jsou velmi pozitivní. Při práci s grafickým tabletem se mi nyní ovládají klávesové zkratky mnohem pohodlněji. Nástroj jsem však shledal uţitečným i při jiných činnostech, například při tvorbě dokumentace LiteKeys pro vkládání různých HTML značek a opakujících se textů. Vzhledem k tomu, jak dlouho mi trval vývoj LiteKeys, mi nezbyl čas na grafickou část mojí práce.
SEZNAM POUŽITÝCH ZDROJŮ [1] How to sit correctly. NHS. [cit. 2015-01-08]. Dostupné na WWW:
. [2] Quick Macros. [cit. 2015-01-08]. Dostupné na WWW: . [3] MEDEK, Petr. HID macros. [cit. 2015-01-08]. Dostupné na WWW: . [4] AutoHotkey. [cit. 2015-01-08]. Dostupné na WWW: . [5] GREBENNIKOV, Nikolay. Keyloggers: Implementing keyloggers in Windows. Part Two. [cit. 2015-01-08]. Dostupné na WWW: . [6] Interception. [cit. 2015-01-08]. Dostupné na WWW: . [7] BLECHA, Vít. Combining Raw Input and keyboard Hook to selectively block input from multiple keyboards. [cit. 2015-01-08]. Dostupné na WWW: . [8] About Raw Input. Microsoft. [cit. 2015-01-08]. Dostupné na WWW: . [9] Hooks Overview. Microsoft. [cit. 2015-01-08]. Dostupné na WWW: . [10] NEWCOMER, Joseph M. Hooks and DLLs. [cit. 2015-01-08]. Dostupné na WWW: . [11] Qt. Digia Plc.. [cit. 2015-01-08]. Dostupné na WWW: . [12] KAPOULKINE, Arseny. Pugixml. [cit. 2015-01-08]. Dostupné na WWW: .
SEZNAM ELEKTRONICKÝCH PŘÍLOH LiteKeysSourceCode.zip LiteKeysVersion1.0.zip LiteKeysUsersGuide.zip
Zdrojový kód nástroje LiteKeys Vydaný nástroj LiteKeys připravený k pouţití Dokumentace nástroje LiteKeys