?? getch.c
字號(hào):
* Hard case: either an extended code or an event which should
* not be recognized. let _getextendedkeycode() do the work...
*/
if ( pCP = _getextendedkeycode( &(ConInpRec.Event.KeyEvent) ) ) {
ch = pCP->LeadChar;
chbuf = pCP->SecondChar;
break;
}
}
}
/*
* Restore previous console mode.
*/
SetConsoleMode( (HANDLE)_coninpfh, oldstate );
return ch;
}
/*
* getche is just getch followed by a putch if no error occurred
*/
#ifdef _MT
int __cdecl _getche_lk (
#else /* _MT */
int __cdecl _getche (
#endif /* _MT */
void
)
{
int ch; /* character read */
/*
* check pushback buffer (chbuf) a for character. if found, return
* it without echoing.
*/
if ( chbuf != EOF ) {
/*
* something there, clear buffer and return the character.
*/
ch = (unsigned char)(chbuf & 0xFF);
chbuf = EOF;
return ch;
}
ch = _getch_lk(); /* read character */
if (ch != EOF) {
if (_putch_lk(ch) != EOF) {
return ch; /* if no error, return char */
}
}
return EOF; /* get or put failed, return EOF */
}
/***
*int _kbhit() - return flag if a keystroke is already waiting to be read
*
*Purpose:
* If the "_ungetch()" push-back buffer is not empty (empty==-1) Then
* Return TRUE
* Otherwise get the Keyboard Status (via DOSQUERYFHSTATE)
*
*Entry:
* None, tests console.
*
*Exit:
* returns 0 if no key waiting
* = !0 if key waiting
*
*Exceptions:
*
*******************************************************************************/
#ifdef _MT
int __cdecl _kbhit_lk(void);
int __cdecl _kbhit (
void
)
{
int retval;
_mlock(_CONIO_LOCK); /* secure the console lock */
retval = _kbhit_lk(); /* determine if a key is waiting */
_munlock(_CONIO_LOCK); /* release the console lock */
return retval;
}
int __cdecl _kbhit_lk (
#else /* _MT */
int __cdecl _kbhit (
#endif /* _MT */
void
)
{
PINPUT_RECORD pIRBuf;
DWORD NumPending;
DWORD NumPeeked;
/*
* if a character has been pushed back, return TRUE
*/
if ( chbuf != -1 )
return TRUE;
/*
* _coninpfh, the handle to the console input, is created the first
* time that either _getch() or _cgets() or _kbhit() is called.
*/
if ( _coninpfh == -2 )
__initconin();
/*
* Peek all pending console events
*/
if ( (_coninpfh == -1) ||
!GetNumberOfConsoleInputEvents((HANDLE)_coninpfh, &NumPending) ||
(NumPending == 0) ||
((pIRBuf = (PINPUT_RECORD)_alloca( NumPending *
sizeof(INPUT_RECORD) )) == NULL) )
{
return FALSE;
}
if ( PeekConsoleInput( (HANDLE)_coninpfh,
pIRBuf,
NumPending,
&NumPeeked ) &&
(NumPeeked != 0L) &&
(NumPeeked <= NumPending) )
{
/*
* Scan all of the peeked events to determine if any is a key event
* which should be recognized.
*/
for ( ; NumPeeked > 0 ; NumPeeked--, pIRBuf++ ) {
if ( (pIRBuf->EventType == KEY_EVENT) &&
(pIRBuf->Event.KeyEvent.bKeyDown) &&
( pIRBuf->Event.KeyEvent.uChar.AsciiChar ||
_getextendedkeycode( &(pIRBuf->Event.KeyEvent) ) ) )
{
/*
* Key event corresponding to an ASCII character or an
* extended code. In either case, success!
*/
return TRUE;
}
}
}
return FALSE;
}
/***
*int _ungetch(c) - push back one character for "_getch()" or "_getche()"
*
*Purpose:
* If the Push-back buffer "chbuf" is -1 Then
* Set "chbuf" to the argument and return the argument
* Else
* Return EOF to indicate an error
*
*Entry:
* int c - Character to be pushed back
*
*Exit:
* If successful
* returns character that was pushed back
* Else if error
* returns EOF
*
*Exceptions:
*
*******************************************************************************/
#ifdef _MT
int __cdecl _ungetch (
int c
)
{
int retval;
_mlock(_CONIO_LOCK); /* lock the console */
retval = _ungetch_lk(c); /* pushback character */
_munlock(_CONIO_LOCK); /* unlock the console */
return retval;
}
int __cdecl _ungetch_lk (
#else /* _MT */
int __cdecl _ungetch (
#endif /* _MT */
int c
)
{
/*
* Fail if the char is EOF or the pushback buffer is non-empty
*/
if ( (c == EOF) || (chbuf != EOF) )
return EOF;
chbuf = (c & 0xFF);
return chbuf;
}
/***
* static CharPair * _getextendedkeycode(pKE) - return extended code (if any)
* for key event.
*
*Purpose:
* Core function for _getch (and getche) and essential to _kbhit. This
* is the function that determines whether or not a key event NOT
* accompanied by an ASCII character has an extended code and returns
* that code.
*
*Entry:
* None, tests console.
*
*Exit:
* if successful, returns a pointer to a CharPair value holding the lead
* and second characters of the extended code.
*
* if unsuccesful, returns NULL
*
*Exceptions:
*
*******************************************************************************/
static CharPair * __cdecl _getextendedkeycode (
KEY_EVENT_RECORD *pKE
)
{
DWORD CKS; /* hold dwControlKeyState value */
CharPair *pCP; /* pointer to CharPair containing extended
code */
int i;
if ( (CKS = pKE->dwControlKeyState) & ENHANCED_KEY ) {
/*
* Find the appropriate entry in EnhancedKeys[]
*/
for ( pCP = NULL, i = 0 ; i < NUM_EKA_ELTS ; i++ ) {
if ( EnhancedKeys[i].ScanCode == pKE->wVirtualScanCode ) {
if ( CKS & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED) )
pCP = &(EnhancedKeys[i].AltChars);
else if ( CKS & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) )
pCP = &(EnhancedKeys[i].CtrlChars);
else if ( CKS & SHIFT_PRESSED)
pCP = &(EnhancedKeys[i].ShiftChars);
else
pCP = &(EnhancedKeys[i].RegChars);
break;
}
}
}
else {
/*
* Regular key or a keyboard event which shouldn't be recognized.
* Determine which by getting the proper field of the proper
* entry in NormalKeys[], and examining the extended code.
*/
if ( CKS & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED) )
pCP = &(NormalKeys[pKE->wVirtualScanCode].AltChars);
else if ( CKS & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) )
pCP = &(NormalKeys[pKE->wVirtualScanCode].CtrlChars);
else if ( CKS & SHIFT_PRESSED)
pCP = &(NormalKeys[pKE->wVirtualScanCode].ShiftChars);
else
pCP = &(NormalKeys[pKE->wVirtualScanCode].RegChars);
if ( ((pCP->LeadChar != 0) && (pCP->LeadChar != 224)) ||
(pCP->SecondChar == 0) )
/*
* Must be a keyboard event which should not be recognized
* (e.g., shift key was pressed)
*/
pCP = NULL;
}
return(pCP);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -