어떤 윈도에 키 값을 보낼때 사용하는 메시지는
키가 눌릴때 WM_KEYDOWN, 키가 눌렸다 때어질때 WM_KEYUP을 윈도우에 보내야 한다.

윈두우 메세지는 다음과 같은 상수로 정의되어 있다.
WM_KEYDOWN = &H100
WM_KEYUP = &H101

위 두 메시지를 키가 눌림을 보내기 위해서는 Sendmessage를 사용하는 것이 아니라 PostMessage 사용하여 메세지를 보내야 한다.

PostMessage는 다음과 같다.
지정된 윈도우에 윈도우 메세지를 보낸다.(해당 윈도우의 메세지 큐에 보내며 보낸 메세지는 메세지 큐에 저장된다)

● 선언 
   Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

● 인수

hwnd ━ 메세지를 전달할 윈도우의 핸들, HWND_BROADCAST 지정하면 시스템의 모든 상위 레벨 윈도우에 전해진다.
wMsg ━ 전달될 메세지, 윈도우 메세지
wParam ━ 메세지와 전달될 wParam 값
lParam ━ 메세지와 전달될 lParam 값

● 반환
성공 ━ 0이 아닌 값
실패 ━ 0

WM_KEYDOWY과 WM_KEYUP 메세지 보낼때
wParam 값은 눌린 키의 가상 키값을 보내야 한다.
가상키 상수의 정의는 다음과 같다.

VK_LBUTTON &h1 마우스 왼쪽 버튼
VK_RBUTTON &h2 마우스 오른쪽 버튼
VK_CANCEL &h03 콘트롤+브레이크
VK_MBUTTON &h04 마우스 중간 버튼
VK_XBUTTON1 &h05 마우스 첫번째 X 버튼
VK_XBUTTON2 &h06 마우스 두뻔째 X 버튼
VK_BACK &h08 백스페이스 키
VK_TAB &h09 탭키
VK_CLEAR &h0C Clear 키
VK_RETURN &h0D 엔터 키
VK_SHIFT &h10 쉬프트 키(양쪽)
VK_CONTROL &h11 콘트롤 키(양쪽)
VK_MENU &h12 알크(양쪽)
VK_PAUSE &h13 파우스 키
VK_CAPITAL &h14 캡스 럭 키
VK_KANA &h15 IME 카나가다 모드
VK_HANGUEL &h15 IME 한글 모드
VK_HANGUL &h15 IME 한글 모드
VK_JUNJA &h17 IME 전자 모드
VK_FINAL &h18 IME final mode
VK_HANJA &h19 IME 한자 모드
VK_KANJI &h19 IME Kanji mode
VK_ESCAPE &h1B 이스케이프 키
VK_CONVERT &h1C IME convert
VK_NONCONVERT &h1D IME nonconvert
VK_ACCEPT &h1E IME accept
VK_MODECHANGE &h1F IME mode change request
VK_SPACE &h20 스페이스바
VK_PRIOR &h21 페이지 업 키
VK_NEXT &h22 페이지 다운 키
VK_END &h23 엔드 키
VK_HOME &h24 홈 키
VK_LEFT &h25 왼쪽 방향 화살표키
VK_UP &h26 윗위쪽 방향 화살표키
VK_RIGHT &h27 오른쪽 방향 화살표키
VK_DOWN &h28 아래쪽 방향 화살표키
VK_SELECT &h29 SELECT key
VK_PRINT &h2A 프린트 키
VK_EXECUTE &h2B EXECUTE key
VK_SNAPSHOT &h2C 프린트 스크린 키
VK_INSERT &h2D 인서트 키
VK_DELETE &h2E 딜리트 키
VK_HELP &h2F HELP key
&h30-&h39 숫자 0-9키
&h41-&h5A 알파벳 A-Z키
VK_LWIN &h5B 왼쪽 윈도우 키
VK_RWIN &h5C 오른쪽 윈도우 키
VK_APPS &h5D Applications key (Natural keyboard)
VK_SLEEP &h5F Computer Sleep key
VK_NUMPAD0 &h60 키패드 0 키
VK_NUMPAD1 &h61 키패드 1 키
VK_NUMPAD2 &h62 키패드 2 키
VK_NUMPAD3 &h63 키패드 3 키
VK_NUMPAD4 &h64 키패드 4 키
VK_NUMPAD5 &h65 키패드 5 키
VK_NUMPAD6 &h66 키패드 6 키
VK_NUMPAD7 &h67 키패드 7 키
VK_NUMPAD8 &h68 키패드 8 키
VK_NUMPAD9 &h69 키패드 9 키
VK_MULTIPLY &h6A 키패드 곱셈 키
VK_ADD &h6B 키패드 덧셈 키
VK_SEPARATOR &h6C 키패드 엔터 키
VK_SUBTRACT &h6D 키패드 빼기 키
VK_DECIMAL &h6E 키패드 소수점 키
VK_DIVIDE &h6F 키패드 나누기 키
VK_F1 &h70 펑션 F1 키
VK_F2 &h71 펑션 F2 키
VK_F3 &h72 펑션 F3 키
VK_F4 &h73 펑션 F4 키
VK_F5 &h74 펑션 F5 키
VK_F6 &h75 펑션 F6 키
VK_F7 &h76 펑션 F7 키
VK_F8 &h77 펑션 F8 키
VK_F9 &h78 펑션 F9 키
VK_F10 &h79 펑션 F10 키
VK_F11 &h7A 펑션 F11 키
VK_F12 &h7B 펑션 F12 키
VK_F13 &h7C 펑션 F13 키
VK_F14 &h7D 펑션 F14 키
VK_F15 &h7E 펑션 F15 키
VK_F16 &h7F 펑션 F16 키
VK_F17 &h80 펑션 F17 키
VK_F18 &h81 펑션 F18 키
VK_F19 &h82 펑션 F19 키
VK_F20 &h83 펑션 F20 키
VK_F21 &h84 펑션 F21 키
VK_F22 &h85 펑션 F22 키
VK_F23 &h86 펑션 F23 키
VK_F24 &h87 펑션 F24 키
VK_NUMLOCK &h90 눔럭 키
VK_SCROLL &h91 스크롤럭 키
&h92-&h96 OEM specific
VK_LSHIFT &hA0 왼쪽 쉬프트 키
VK_RSHIFT &hA1 오른쪽 쉬프트 키
VK_LCONTROL &hA2 왼쪽 컨트롤 키
VK_RCONTROL &hA3 오른쪽 컨트롤 키
VK_LMENU &hA4 왼쪽 알트 키
VK_RMENU &hA5 오른쪽 알트 키
VK_BROWSER_BACK &hA6 Browser Back key
VK_BROWSER_FORWARD &hA7 Browser Forward key
VK_BROWSER_REFRESH &hA8 Browser Refresh key
VK_BROWSER_STOP &hA9 Browser Stop key
VK_BROWSER_SEARCH &hAA Browser Search key
VK_BROWSER_FAVORITES &hAB Browser Favorites key
VK_BROWSER_HOME &hAC Browser Start and Home key
VK_VOLUME_MUTE &hAD Volume Mute key
VK_VOLUME_DOWN &hAE Volume Down key
VK_VOLUME_UP &hAF Volume Up key
VK_MEDIA_NEXT_TRACK &hB0 Next Track key
VK_MEDIA_PREV_TRACK &hB1 Previous Track key
VK_MEDIA_STOP &hB2 Stop Media key
VK_MEDIA_PLAY_PAUSE &hB3 Play/Pause Media key
VK_LAUNCH_MAIL &hB4 Start Mail key
VK_LAUNCH_MEDIA_SELECT &hB5 Select Media key
VK_LAUNCH_APP1 &hB6 Start Application 1 key
VK_LAUNCH_APP2 &hB7 Start Application 2 key
VK_OEM_1 &hBA ';:' 키
VK_OEM_PLUS &hBB '+' 키
VK_OEM_COMMA &hBC ',' 키
VK_OEM_MINUS &hBD '-' 키
VK_OEM_PERIOD &hBE '.' 키
VK_OEM_2 &hBF '/?' 키
VK_OEM_3 &hC0 '`~' 키
VK_OEM_4 &hDB '[{' 키
VK_OEM_5 &hDC '\|' 키
VK_OEM_6 &hDD ']}' 키
VK_OEM_7 &hDE '작은따옴표.큰따옴표' 키
VK_OEM_8 &hDF
&hE1 OEM specific
VK_OEM_102 &hE2 Either the angle bracket key or the backslash key on the RT 102-key keyboard
&hE3-&hE4 OEM specific
VK_PROCESSKEY &hE5 IME PROCESS key
&hE6 OEM specific
VK_PACKET &hE7 Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
&hE9-&hF5 OEM specific
VK_ATTN &hF6 Attn key
VK_CRSEL &hF7 CrSel key
VK_EXSEL &hF8 ExSel key
VK_EREOF &hF9 Erase EOF key
VK_PLAY &hFA Play key
VK_ZOOM &hFB Zoom key
VK_NONAME &hFC Reserved
VK_PA1 &hFD PA1 key
VK_OEM_CLEAR &hFE Clear key

lParam 값은 아래 형식을 맞추어 보내야 한다.

0~15 반복 카운트
16~23 스캔코드
24 오른쪽 Alt,Ctrl,키패드등 101키에만 있는 확장키가 눌러졌을 경우 1이 돤다
25~28 미사용
29 Alt키가 눌러졌으면 1
30 메시지가 보내지기 전에 키가 눌려져 있었으면 1
31 키가 놓아지면 1, 눌러지면 0

하위 비트가 0번 비트이다. 즉 1이라는 숫자가 저장될때 1이 지정되는 비트(최하위 비트)가 0번 비트이다.
가상키 값에 대한 스캔코드 값을 구하기 위해서는 MapVirtualKey함수를 사용하면 된다.

다음의 명령버튼에 엔터 키를 보내는 소스이다.
Option Explicit
Private Const VK_RETURN = &HD
Private Const MAPVK_VK_TO_VSC = 0
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Sub Command1_Click()
    Debug.Print "테스트"
End Sub

Private Sub Command2_Click()
    Dim VirtualKey As Long
    Dim ScanKey As Long
    
    Command1.SetFocus
    VirtualKey = VK_RETURN
    ScanKey = MapVirtualKey(VK_RETURN, MAPVK_VK_TO_VSC) * 2 ^ 16 + 1 ' 스캔 코드 값이 저장될 위치에 들어가도록 하기 위해서고, 1은 반복 카운터이다.
    PostMessage Command1.hWnd, WM_KEYDOWN, VirtualKey, ByVal ScanKey
    PostMessage Command1.hWnd, WM_KEYUP, VirtualKey, ByVal ScanKey Or &HC0000000 ' 키가 떼어졌을때, 31과 30 번째 비트를 설정하기 위해 비트 연산을 하였음
End Sub

vb에서 두정수의 논리 연산자를 사용하여 연산을 하게 되면 비트 연산을 하게 되다.

+ Recent posts