/* * File......: SCANCODE.PRG * Author....: Glenn Scott (from John Kaster) * CIS ID....: 71620,1521 * * This is an original work by Glenn Scott and is placed in the * public domain. * * Modification history: * --------------------- * * Rev 1.3 15 Aug 1991 23:04:32 GLENN * Forest Belt proofread/edited/cleaned up doc * * Rev 1.2 14 Jun 1991 19:52:52 GLENN * Minor edit to file header * * Rev 1.1 12 Jun 1991 02:30:32 GLENN * Documentation mod and check for ft_int86() compatibility * * Rev 1.0 01 Apr 1991 01:02:12 GLENN * Nanforum Toolkit * */ /* $DOC$ * $FUNCNAME$ * FT_SCANCODE() * $CATEGORY$ * Keyboard/Mouse * $ONELINER$ * Wait for keypress and return keyboard scan code * $SYNTAX$ * FT_SCANCODE() -> cCode * $ARGUMENTS$ * None * $RETURNS$ * A two-character string, corresponding to the keyboard scan code. * $DESCRIPTION$ * FT_SCANCODE() enables you to distinguish the different scancodes * of similar keys (such as Grey minus versus regular minus), thus * increasing the number of keys your input routine can recognize. * * It works like INKEY(), in that it waits for a key to be pressed. * The scan code consists of two bytes, which are returned as a * two-character string. * * For example, calling FT_SCANCODE() and pressing the Grey-minus * key will return a two character string: * * CHR(45) + CHR(74) * * LASTKEY() is not updated by FT_SCANCODE(), so don't try to * test LASTKEY() to see what was pressed during an FT_SCANCODE() * call. Simply assign the return value to a variable and test * that (see the test driver below). * * * This was adapted from a short C routine posted by John Kaster on * NANFORUM. It was written in Clipper to help demonstrate the * FT_INT86 function of the Nanforum Toolkit. * * This program requires FT_INT86(). * $EXAMPLES$ * cKey := FT_SCANCODE() * * [grey-] returns: CHR(45) + CHR(74) * [-] returns: CHR(45) + CHR(12) * [grey+] returns: CHR(43) + CHR(78) * [+] returns: CHR(43) + CHR(13) * $END$ */ #include "ftint86.ch" #define KEYB 22 #ifdef FT_TEST #DEFINE SCANCODE_ESCAPE (chr(27) + chr(1)) FUNCTION main() LOCAL getlist, cKey CLEAR QOut("Press any key, ESCape to exit:") while .t. cKey := FT_SCANCODE() QOUT( "chr(" + str(asc(substr(cKey,1,1)),3) + ")+chr(" + str(asc(substr(cKey,2,1)),3) + ")" ) if cKey == SCANCODE_ESCAPE exit endif end RETURN nil #endif FUNCTION FT_SCANCODE() LOCAL aRegs[ INT86_MAX_REGS ] aRegs[ AX ] = MAKEHI( 0 ) FT_INT86( KEYB, aRegs ) RETURN ( chr(LOWBYTE( aRegs[AX] )) + chr(HIGHBYTE( aRegs[AX] )) )