키보드는 눌려지거나 떼어졌을 때 컴퓨터로 눌려지거나 떼어진 키 번호를 보낸다. 이 키 번호를 스캔코드(scan code)라고 한다.
그러나 scan code는 키보드 종류에 따라 다르다. 따라서 윈도우즈는 응용 프로그램 제작자들의 편의를 위해 이 스캔 코드를 가상키(virtual key)로 바꾸어준다.

MapVirtualKey API를 사용하면 가상키 값과 스캔코드 값에 대한 서로 대응 되는 값을 얻을수 있다.

다음 예는 스캔 코드 값을 상호 변환하는 예이다.
초기 화면 폼이다.


두자리 이하의 16진수 값을 입력하고 엔터를 입력하면 상호 변환된다.


다음은 위 작업에 대한 소스이다.
' 가상키값과 스캔코드값의 상호 변환, 16진수 두자리 이하 값을 입력하고 엔터 치변 상호 변환된다
Option Explicit

Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Const MAPVK_VK_TO_VSC = 0
Private Const MAPVK_VSC_TO_VK_EX = 3

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) ' 가상키값을 스캔코드 값으로
    If Not ValueCheck(Text1.Text, KeyCode) Then Exit Sub
    Text2.Text = Hex(MapVirtualKey(CLng("&h" & Text1.Text), MAPVK_VK_TO_VSC))
End Sub

Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer) ' 스캔 코드값을 가상키값으로
    If Not ValueCheck(Text2.Text, KeyCode) Then Exit Sub
    Text1.Text = Hex(MapVirtualKey(CLng("&h" & Text2.Text), MAPVK_VSC_TO_VK_EX))
End Sub

Private Function ValueCheck(KeyValue As String, ByVal KeyCode As Long) As Boolean
    ValueCheck = False
    If Not KeyCode = vbKeyReturn Then Exit Function
    If Len(KeyValue) = 0 Then Exit Function
    If CLng("&h" & Text1.Text) = 0 Then Exit Function
    ValueCheck = True
End Function

키보드 관련 윈도우 메세지와, API 함수들 대부분은 가상키값이 사용된다.

+ Recent posts