강좌와 팁

Caps Lock 키의 상태 조사 및 변경 날짜:2022-3-28 1:55:19 조회수:312
작성자 : daypark
포인트 : 1039
가입일 : 2020-02-14 10:42:05
방문횟수 : 217
글 153개, 댓글 26개
소개 : 자기소개를 입력하십시오.
작성글 보기
쪽지 보내기
Caps Lock 키는 일반적으로 사용자가 직접 토글하며 사용하는 키이지만 코드에서 의도적으로 조사하거나 직접 바꿀 수도 있다.
반드시 대문자로 입력해야 하는 제품 코드나 대문자를 금지해야 하는 경우 등이다.
조사할 때는 GetKeyState(VK_CAPITAL)을 호출한 후 최하위 비트가 1인지만 보면 된다. 최하위 비트는 토글키의 현재 상태를 조사하는데 비해 최상위 비트는 지금 눌러져 있는지 조사한다. 
이 둘의 차이를 잘 구분해야 하는데 최상위 비트는 지금 눌러져 있는지 보는 것이고 최하위 비트는 전에 눌러 놓아 대문자 고정 상태인지 조사하는 것이다. 즉, 지금 누르고 있느냐, 전에 눌러 놓았느냐의 차이이다. 
변경할 때는 keybd_event(VK_CAPITAL, 0, 0, 0) 호출로 누른 후 keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0) 호출로 다시 뗀다. 사옹자 대신 키를 눌러주는 것이다. 
어찌 보면 원론적으로 간단한 방법이다. 소스 코드는 다음과 같다. 

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    TCHAR str[128];

    switch (iMessage) {
    case WM_CREATE:
        hWndMain = hWnd;
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // 현재 상태 조사.
        if ((GetKeyState(VK_CAPITAL) && 1) == 0) {
            lstrcpy(str, TEXT("Caps Lock Off"));
        } else {
            lstrcpy(str, TEXT("Caps Lock On"));
        }
        TextOut(hdc, 10, 10, str, lstrlen(str));
        EndPaint(hWnd, &ps);
        return 0;
    case WM_LBUTTONDOWN:
        // 현재 상태 토글
        keybd_event(VK_CAPITAL, 0, 0, 0);
        keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);
        InvalidateRect(hWnd, NULL, TRUE);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

Win32 프로젝트를 만들고 소스 붙여 넣은 후 실행한다.
화면에 Caps Lock키의 현재 상태를 보여주고 마우스 버튼을 클릭하면 토글한다.
특정 상태로 강제 조정하려면 상태를 먼저 조사해 보고 원하는 상태가 아닐 경우 뒤집으면 된다. 
 

목록보기 삭제 수정 신고 스크랩


로그인하셔야 댓글을 달 수 있습니다.