------ Kterak si podbrobit klávesnici -----
Možná jste si někdy všimli, že se skoro u každé hry nebo
programu chová klávesnice pokaždé úplně jinak. Většinou se můžete
setkat s vlastnostmi tohoto charakteru: Num Lock, Caps Lock a Scroll
Lock nereagují a kontrolky svítí stále stejně jako před spuštěním
programu, nefunguje Ctrl-C, Ctrl-Break, Ctrl-Alt-Del, známé to
kombinace brutálně ukončující právě běžící program. Disablování
těchto funkcí je s největší pravděpodobností záměr autora programu.
Možná jste se s podobným problémem při psaní programů setkali, ale
stále nemůžete přijít na to, jak podobné srandičky s klávesnicí
realizovat. Celý princip spočívá ve vlastním handleru softwarového
přerušení klávesnice INT9. Možná si myslíte, že je to zavání
praktikami virů a vůbec všech magických programů, které dokáží
vymlátit z počítače všechno možné, ale ono to v podstatě jinak nelze.
Nastavení vlastního klávesnicového handleru získáte obrovské množství
výhod, o kterých se vám před tím ani nesnilo. Odpadá používání
trapného ReadKey a podobné násilnické funkce, klávesnice bude pod
vaší kontrolu a pokud budete chtít, aby se vám někdo na INT9 nemotal,
stačí použít obnovovací stealth metodu, kterou ovšem doporučuji pouze
pro pokročilé programátory. V neposlední řadě si můžete dělat se
scankódy stisklých kláves cokoli, třeba je úplně vyřadit z funkce
nebo je používat v neomezeném množství třeba ve hře, která by měla
zvládat třeba 6 klávesnicových hráčů najednou. V průběhu programu se
nebudete vůbec muset starat o to,jestli se má zrovna teď číst klávesa
nebo ne. Prostě si kdykoli porovnáte proměnnou, do které vám váš
handler ukládá scan kód poslední stisklé klávesy a provedete
požadovanou funkci. Nebo si můžete vytvořit vlastní buffer pro
stisklé klávesy a s ním pak pracovat. Nechci nijak snižovat filozofii
BIOSu a na něm závislých kompilátorů high-level jazyků, ale vlastní
handler klávesnice je to nejlepší řešení.
Jak na to v praxi ? Je to velice jednoduché stačí akorát znát
příslušné číslo portu odkud vám klávesnice bude posílat scankódy.
Ostatní už obstará Pascal. Zde je příklad, jak by takový jednoduchý
prográmek, který používá vlastní ovladač klávesnice měl vypadat:
Uses Dos;
Var OldKeyBHandler : Procedure;
UseBIOSHandler : Boolean;
KeyPressed : Byte;
{F+}
Procedure MyKeyBHandler(Flags, CS, IP, AX, BX, CX, DX,
SI, DI, DS, ES, BP: Word); Interrupt;
begin
KeyPressed:=Port[60];
if UseBIOSHandler then
begin
asm pushf end;
OldKeyBHandler;
end else Port[20]:=20;
end;
{F-}
Begin
UseBIOSHandler:=False;
GetIntVec(9,@OldKeyBHandler);
SetIntVec(9,@MyKeyBHandler);
......
V programu můžete i rychle přepnout zpět do staré BIOS klávesnice
pomocí UseBIOSHander, pokud je to potřeba (například při použití
některých Pascalských funkcí nebo pokud už máte nějaké vaše starší
funkce, které pracují se základním BIOS handlerem...).
......
SetIntVec(9,@OldKeyboardHandler);
End.
Na závěr přikládám oficiální scankódy kláves, které vám bude posílat
klávesnice přes port 60. Jsou v podstatě podobné jako v ASCII
konvenci, ale pozor na výjimky ! Také si možná všimnete další velké
výhody, jelikož ASCII konvence neuznává tzv. stavové kávesy jako
Ctrl, Alt, Shift, musí se za normálních okolností ohlídávat jejich
stisk různými prasáckými způsoby, které zde nebudu radši
osvětlovat. Při použití vlastního handleru je po problémech. Každá
klávesa má ve skutečnosti dva scankódy, ten první (kódy zapsané v
tabulce) určuje zda-li je určitá klávesa právě stisknutá, potom
existuje ještě druhý scan kód, který odpovídá klávese, která byla
naposledy stisknuta, tento scankód zpravidla odpovídá scankódu při
stisku klávesy plus 128. Existuje také speciální scankód (E0), který
určuje, zdali je právě stisknutá klávesa držena dostatečně dlouho,
aby se v programu aktivovala určitá specifická funkce, jako například
v Nortonu, když chvíli podržíte šipkovou klávesu, začne vám rychleji
scrolovat menu-bar, kterým vybíráte fajly.
1 Esc 44 z
2 1 45 x
3 2 46 c
4 3 47 v
5 4 48 b
6 5 49 n
7 6 50 m
8 7 51 , <
9 8 52 . >
10 9 53 / ?
11 0 54 Right-Shift
12 - _ 55 * (keypad)
13 = + 56 Left-Alt
14 BackSpace 57 SpaceBar
15 Tab 58 Caps-Lock
16 q 59 F1
17 w 60 F2
18 e 61 F3
19 r 62 F4
20 t 63 F5
21 y 64 F6
22 u 65 F7
23 i 66 F8
24 o 67 F9
25 p 68 F10
26 [ { 69 Num-Lock (keypad)
27 ] } 70 Scroll-Lock
28 Enter (Return) 71 7 Home (keypad)
29 Left-Arrow 72 8 Up (keypad)
30 a 73 9 PgUp (keypad)
31 s 74 - (keypad)
32 d 75 4 Left (keypad)
33 f 76 5 (keypad)
34 g 77 6 Right (keypad)
35 h 78 + (keypad)
36 j 79 1 End (keypad)
37 k 80 2 Down (keypad)
38 l 81 3 PgDn (keypad)
39 ; : 82 0 Insert (keypad)
40 ' " 83 . Del (keypad)
41 ' 87 F11
42 Left Shift 88 F12
28 Enter (keypad) 75 Left (not keypad)
29 Right-Arrow 77 Right (not keypad)
42 Print-Screen 79 End (not keypad)
53 / (keypad) 80 Down (not keypad)
55 Print-Screen 81 Page-Down (not keypad)
56 Right-Alt 82 Insert (not keypad)
71 Home (not keypad) 83 Delete (not keypad)
72 Up (not keypad) 111 Macro
73 Page-Up (not keypad)
Pro majitele klávesnice Windows 95 tu mám scankódy speciálních kláves
s hnusným okýnkem a nějakým menu s šipkou, nebo co to je :) To levý
okýnko má 91, pravý 92 a to menu 93. Jako nápad zlepšení klávesnice
to není špatné, ale o použití radši ani mluvit nebudu. Nejlepší
cesta, jak sabotovat Microsoft, je, udělat programy, které budou tyto
klávesy využívat pro svojí vlastní potřebu a Wokna budou mít smůlu.
Taky to chce hromadně vydat přelepky...
ReDox
výheň