어떤 윈도에 키 값을 보낼때 사용하는 메시지는
키가 눌릴때 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에서 두정수의 논리 연산자를 사용하여 연산을 하게 되면 비트 연산을 하게 되다.
'API' 카테고리의 다른 글
waveOutSetVolume을 사용한 사운드 볼륨 조정 (0) | 2011.09.24 |
---|---|
waveOutGetNumDevs를 사용한 사운드 카드수 얻기 (0) | 2011.09.24 |
GetVolumeInformation를 사용한 하드 드라이브 정보 얻기 (0) | 2011.09.23 |
FindExecutable을 사용한 확장자와 연결된 프로그램 경로 얻기 (0) | 2011.09.23 |
Beep를 사용한 PC 스피커로 음악 연주 (0) | 2011.09.23 |