Программирование игр для 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


Содержание раздела