MFC/MFC 코드기록

IME 입력 상태(한글 모드)에서 Virtual-key code 읽기

lwj789 2023. 2. 21. 10:50

한글 입력모드에서 입력을 하고 있으면, WM_KEYDOWN의 wParam이 VK code가 올라 오지 않고, VK_PROCESSKEY가 올라온다. 
scan code는 WM_KEYDOWN message의 lParam의 16~23 bit (8bit)인데, 이를 "MapVirtualKey()"함수를 사용해서 virtual key code를 얻을 수 있다.

 

핵심 코드

int scan = (lParam >> 16) & 0xff;
int vkcode = ::MapVirtualKey(scan, MAPVK_VSC_TO_VK_EX);

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BOOL CTESTDlg::PreTranslateMessage(MSG *pMsg)
{
    // 코드 에디트로 전달되는 키 메시지는 직접 처리한다. 이 루틴이 있어야지
    // 키 입력시에 오류 소리가 발생하지 않는다.
    if (pMsg->message == WM_KEYDOWN) 
    {
        if (pMsg->wParam == VK_PROCESSKEY)
        {
            int scan = 0;
            int vkcode = 0;
            scan = (pMsg->lParam >> 16& 0xff;
            vkcode = ::MapVirtualKey(scan, MAPVK_VSC_TO_VK_EX);
            pMsg->wParam = vkcode;
        }
    }
}
cs