Ïðîãðàììèðîâàíèå èãð äëÿ Windows. Ñîâåòû ïðîôåññèîíàëà

       

Òåïåðü âñå âìåñòå: Äåìîíñòðàöèîííàÿ ïðîãðàììà ðàáîòû ñ êëàâèàòóðîé


Êàê òåïåðü íàñ÷åò òîãî, ÷òîáû ñîáðàòü âñå íàïèñàííîå ïðî êëàâèàòóðó â îäíó êó÷ó?  Ëèñòèíãå 3.7 ïðåäñòàâëåíà äåìîíñòðàöèîííàÿ ïðîãðàììà, êîòîðàÿ ñîñòîèò èç âûçîâîâ óæå íàïèñàííûõ â ýòîé ãëàâå ôóíêöèé. Îíà ïîêàçûâàåò ñêàí-êîäû íàæàòûõ êëàâèø è ñîñòîÿíèå êëàâèø Ctrl è Alt. Åñëè âû íàæìåòå Q, ïðîãðàììà çàâåðøèò ñâîþ ðàáîòó.

Ëèñòèíã 3.7. Äåìîíñòðàöèîííàÿ ïðîãðàììà ðàáîòû ñ êëàâèàòóðîé (KEY.C).

// ÂÊËÞ×ÀÅÌÛÅ ÔÀÉËÛ ///////////////////////////////////////

#include <dos.h>

#include <bios.h>

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <graph.h>

// ÎÏÐÅÄÅËÅÍÈß ///////////////////////////////////////////////

// áèòîâûå ìàñêè äëÿ óïðàâëÿþùèõ êëàâèø

#define SHIFT_R             0õ0001

#define SHIFT_L             0õ0002



#define CTRL                0õ0004

#define ALT                 0õ0008

#define SCROLL_LOCK_ON      0õ0010

#define NUM_LOCK_ON         0õ0020

#define CAPS_LOCK_ON        0õ0040

#define INSERT_MODE         0õ0080

#define CTRL_L              0õ0100

#define ALT_L               0õ0200

#define CTRL_R              0õ0400

#define ALT_R               0õ0800

#define SCROLL_LOCK_DWN     0õ1000

#define NUM_LOCK_DWN        0õ2000

#define CAPS_LOCK_DWN       0õ4000

#define SYS_REQ_DWN         0õ8000

// Çíà÷åíèÿ ñêàí-êîäîâ. Âíèìàíèå: êàæäàÿ êëàâèøà ïðîäóöèðóåò òîëüêî

// îäèí ñêàí-êîä, ïîýòîìó îïðåäåëåíèÿ äàíû òîëüêî äëÿ ñèìâîëîâ

// íèæíåãî ðåãèñòðà. Íàïðèìåð, îäíà è òà æå êëàâèøà ñîîòâåòñòâóåò

// ñèìâîëó "1" (íèæíèé ðåãèñòð) è ñèìâîëó "!" (âåðõíèé ðåãèñòð).

// Îäíàêî ïîëüçîâàòüñÿ íàäî âñå ðàâíî îïðåäåëåíèåì SCAN_1

#define SCAN_ESC          1

#define SCAN_1            2

#define SCAN_2            3

#define SCAN_3            4

#define SCAN_4            5

#define SCAN_5            6

#define SCAN_6            7

#define SCAN_7            8

#define SCAN_8            9

#define SCAN_9            10

#define SCAN_0            11

#define SCAN_MINUS        12

#define SCAN_EQUALS       13




#define SCAN_BKSPàààààààà 14

#define SCAN_TABààààààààà 15

#define SCAN_Qààààààààààà 16

#define SCAN_Wààààààààààà 17

#define SCAN_Eààààààààààà 18

#define SCAN_Rààààààààààà 19

#define SCAN_Tààààààààààà 20

#define SCAN_Yàààààààà 21

#define SCAN_Uàààààààà 22

#define SCAN_Iàààààààà 23

#define SCAN_0àààààààà 24

#define SCAN_Pàààààààà 25

# define SCAN_LFT_BRACKET 26

#define SCAN_RGT_BRACKET 27

#define SCAN_ENTERàààà 28

#define SCAN_CTRLààààà 29

#define SCAN_Aàààààààà 30

#define SCAN_Sàààààààà 31

#define SCAN_Dàààààààà 32

#define SCAN_Fàààààààà 33

#define SCAN_Gàààààààà 34

#define SCAN_Hàààààààà 35

#define SCAN_Jàààààààà 36

#define SCAN_Kàààààààà 37

#defane SCAN_Làààààààà 38

#define SCAN_SEMIààààà 39

#define SCAN_APOSààààà 40

#define SCANJTILDEàààà 41

#define SCAN_LEFT_SHIFT 42

#define SCAN_BACK_SLASH 43

#define SCAN_Zàààààààà 44

#define SCAN_Xàààààààà 45

#define SCAN_Càààààààà 46

#define SCAN_Vàààààààà 47

#define SCAN_Bàààààààà 48

#define SCAN_Nàààààààà 49

#define SCAN_Màààààààà 50

#define SCAN_COMMAàààà 51

#define SCAN_PERIODààà 52

#define SCAN_FOWARD_SLASH 53

#define SCAN_RIGHT_SHIFT 54

#define SCAN_PRT_SCRNà 55

#define SCAN_ALTàààààà 56

#define SCAN_SPACEàààà 57

#define SCAN_CAPS_LOCK 58

#define SCAN_F1ààààààà 59

#define SCAN_F2ààààààà 60

#define SCAN_F3ààààààà 61

#define SCAN_F4ààààààà 62

#define SCAN_F5ààààààà 63

#define SCAN_F6ààààààà 64

#define SCAN_F7ààààààà 65

#define SCAN_F8ààààààà 66

#define SCAN_F9ààààààà 67

#define SCAN_F10àààààà 68

#define SCAN_Fllàààààà 133

#define SCAN_Fl2àààààà 134

#define SCAN_NUM_LOCKà 69

#define SCAN_SCROLL_LOCKà 70

#define SCAN_HOMEàààààààà 71

#define SCAN_UPàààààààààà 72

#define SCAN_PGUPàààààààà 73

#define SCAN_NUM_MINUSààà 74

#define SCAN_LEFTàààààààà 75

#define SCAN_CENTERàààààà 76

#define SCAN_RIGHTààààààà 77

#define SCAN_NUM_PLUSàààà 78

#define SCAN_ENDààààààààà 79

#define SCAN_DOWNàààààààà 80

#define SCAN_PGDWNààààààà 81

#define SCAN_INSààààààààà 82

#define SCAN_DELààààààààà 83



// LL=¦ãLL /////////////////////////////////////////////

unsigned char Get_Ascii_Key(void)

{

// +¸ûø ò ñº¯õ¨õ úûðòø𪺨v õ¸ª¹ ¸øüòþû, ¯ºýú¡ø  òþ÷ò¨ð•ðõª õóþ

// ASCII-úþô. +¸ûø ¸øüòþûð ýõª, òþ÷ò¨ð•ðõª¸  0.

if (_bios_keybrd(_KEYBRD_READY)) return(_bios_keybrd(_KEYBRD_READ)) ;

else return(0);

} // úþýõ¡ ¯ºýú¡øø

////////////////////////////////////////////////////////

unsigned int Get_Control_Keys(unsigned int mask)

(ààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà

// ¯ºýú¡ø  òþ÷ò¨ð•ðõª ¸þ¸ªþ ýøõ û¦ñþù ºÿ¨ðòû ¦•õù úûðòø°ø

return(mask & _bios_keybrd(_KEYBRD_SHIFTSTATUS));

}//úþýõ¡ ¯ºýú¡øø ////////////////////////////////////////////////////////

unsigned char Get_Scan_Code(void) (

// ¯ºýú¡ø  òþ÷ò¨ð•ðõª ¸úðý-úþô ýðöðªþù úûðòø°ø // ø¸ÿþû¹÷ºõª¸  ò¸ª¨þõýývù ð¸¸õüñûõ¨

_asm{

mov ah,01hààà ;¯ºýú¡ø  01h - ÿ¨þòõ¨úð ýðöðªø  úûðòø°ø

int 16hàààààà ;òv÷þò ÿ¨õ¨vòðýø 

jz emptyààààà ;ýõª ¸øüòþûð - òv¿þôààààààààà

mov ah,00hààà ;¯ºýú¡ø  0 - ÿþûº¢õýøõ ¸úðý-úþôð

int 16hàààààà ;òv÷þò ÿ¨õ¨vòðýø 

mov al,ahàààà ;ÿõ¨õüõ•ðõü ¨õ÷ºû¹ªðª ø÷ L= ò AL

xor ah,ahàààà ;þñýºû õü L=

jmp doneààààà ;¨õ÷ºû¹ªðª òþ÷ò¨ð•ðõª¸  ò L-

empty:

xor ax,axààà ;þñýºû õü AX

done:

} //úþýõ¡ ð¸¸õüñûõ¨ýþóþ ñûþúð

} // úþýõ¡ ¯ºýú¡øø

// +T=+T=L- ¦¦++¦L¦¦L ///////////////////////////////////////

void main(void)

{

unsigned char key;

int done=0;

unsigned int control;

_clearscreen(_GCLEARSCREEN);

while(!done)

{

_settextposition(2,0);

if ( (key = Get_Scan_Code()) ) printf("%c %dà ",key,key);

// ÿ¨þòõ¨úð ýð ýðöðªøõ Ctrl ø Alt

if (Get_Control_Keys(CTRL))

printf("\ncontrol key pressed");

if (Get_Cbntrol_Keys(ALT))

printf("\nalt key pressedààà ");

if (key==16) done=1); // 16 × ¤ªþ ¸úðý-úþô úûðòø°ø Q

}// úþýõ¡ ¡øúûð while

} // úþýõ¡ ¯ºýú¡øø main


Ñîäåðæàíèå ðàçäåëà