/** * 스캔 코드를 ASCII 코드로 변환 */ BOOL kConvertScanCodeToASCIICode( BYTE bScanCode, BYTE* pbASCIICode, BOOL* pbFlags ) { BOOL bUseCombinedKey; // 이전에 Pause 키가 수신되었다면, Pause의 남은 스캔 코드를 무시 if( gs_stKeyboardManager.iSkipCountForPause > 0 ) { gs_stKeyboardManager.iSkipCountForPause--; return FALSE; } // Pause 키는 특별히 처리 if( bScanCode == 0xE1 ) { *pbASCIICode = KEY_PAUSE; *pbFlags = KEY_FLAGS_DOWN; gs_stKeyboardManager.iSkipCountForPause = KEY_SKIPCOUNTFORPAUSE; return TRUE; } // 확장 키 코드가 들어왔을 때, 실제 키 값은 다음에 들어오므로 플래그 설정만 하고 종료 else if( bScanCode == 0xE0 ) { gs_stKeyboardManager.bExtendedCodeIn = TRUE; return FALSE; } // 조합된 키를 반환해야 하는가? bUseCombinedKey = kIsUseCombinedCode( bScanCode ); // 키 값 설정 if( bUseCombinedKey == TRUE ) { *pbASCIICode = gs_vstKeyMappingTable[ bScanCode & 0x7F ].bCombinedCode; } else { *pbASCIICode = gs_vstKeyMappingTable[ bScanCode & 0x7F ].bNormalCode; } // 확장 키 유무 설정 if( gs_stKeyboardManager.bExtendedCodeIn == TRUE ) { *pbFlags = KEY_FLAGS_EXTENDEDKEY; gs_stKeyboardManager.bExtendedCodeIn = FALSE; } else { *pbFlags = 0; } // 눌러짐 또는 떨어짐 유무 설정 if( ( bScanCode & 0x80 ) == 0 ) { *pbFlags |= KEY_FLAGS_DOWN; } // 조합 키 눌림 또는 떨어짐 상태를 갱신 UpdateCombinationKeyStatusAndLED( bScanCode ); return TRUE; }
BOOL kConvertScanCodeToASCIICode( BYTE bScanCode, BYTE* pbASCIICode, BOOL* pbFlags ) { BOOL bUseCombinedKey; // 이전에 PAUSE키가 수신되었다면 PAUSE의 남은 스캔코드 무시 if ( gs_stKeyboardManager.iSkipCountForPause > 0 ) { gs_stKeyboardManager.iSkipCountForPause--; return FALSE; } // PAUSE키는 특별히 처리 if (bScanCode == 0xE1) { *pbASCIICode = KEY_PAUSE; *pbFlags = KEY_FLAGS_DOWN; gs_stKeyboardManager.iSkipCountForPause = KEY_SKIPCOUNTFORPAUSE; return TRUE; } // 확장 키코드인경우 실제 키는 다음에 들어오므로 플래그 설정만 하고 종료 if (bScanCode == 0xE0) { gs_stKeyboardManager.bExtendedCodeIn = TRUE; return TRUE; } // 앞서 어떤 키보드인경우 신호를 주는 루틴은 처리 완료, 앞으로는 키 반환 루틴 bUseCombinedKey = kIsUseCombinedCode( bScanCode ); // 조합키인경우 if ( bUseCombinedKey == TRUE ) { *pbASCIICode = gs_vstKeyMappingTable[ bScanCode & 0x7F ].bCombinedCode; } else { *pbASCIICode = gs_vstKeyMappingTable[ bScanCode & 0x7F ].bNormalCode; } // 확장 키 유무 설정 if ( gs_stKeyboardManager.bExtendedCodeIn == TRUE ) { *pbFlags = KEY_FLAGS_EXTENDEDKEY; gs_stKeyboardManager.bExtendedCodeIn = FALSE; } else { *pbFlags = 0; } if( (bScanCode & 0x80) == 0 ) { *pbFlags |= KEY_FLAGS_DOWN; } UpdateCombinationKeyStatusAndLED( bScanCode ); return TRUE; }
/// Translate ScFALSEan Code to ASCII. bool kKeyboard::kConvertScanCodeToASCIICode(BYTE bScanCode, char* pbASCIICode, BYTE* pbFlags) { bool bUseCombineKey; // If Pause is pused before, // ignore rest Scan Code of Pause. if (iSkipCountForPause > 0) { iSkipCountForPause--; return false; } // Special handling for Pause. if (bScanCode == 0xE1) { *pbASCIICode = KEY_PAUSE; *pbFlags = KEY_FLAGS_DOWN; iSkipCountForPause = KEY_SKIPCOUNTFORPAUSE; return true; } // If exnteded key is entered, actual key value will be entered next. // So set flag and return else if (bScanCode == 0xE0) { bExtendedCodeIn = true; return false; } // Return a combination key? bUseCombineKey = kIsUseCombinedCode(bScanCode); // Set key value if (bUseCombineKey == true) { *pbASCIICode = stKeyMappingTable[bScanCode & 0x7F].bCombinedCode; } else { *pbASCIICode = stKeyMappingTable[bScanCode & 0x7F].bNormalCode; } // Set whether or not it is extended key if (bExtendedCodeIn == true) { *pbFlags = KEY_FLAGS_EXTENDEDKEY; bExtendedCodeIn = false; } else { *pbFlags = 0; } // Check push or release if ((bScanCode & 0x80) == 0) { *pbFlags |= KEY_FLAGS_DOWN; } // update push or release of a combination key kUpdateCombinationKeyStatusAndLED(bScanCode); return true; }