프로젝트 도중 키 이벤트를 강제로 발생시켜야 하는 상황이 생겼는데요;;
SendMessage로 WM_KEYDOWN을 보내놓고, 키가 입력되지 않는다고 화내고 있었습니다''
keybd_event라는 키보드 메세지를 생성해주는 훌륭한 Win32 API함수가 있더군요
keybd_event 함수의 원형은 다음과 같습니다.(USER32.DLL)
VOID keybd_event(
BYTE bVk, // 가상 키코드
BYTE bScan, // 하드웨어 스캔 코드
DWORD dwFlags, // 동작 지정 Flag
PTR dwExtraInfo // 추가 정보
);
bVK
가상키코드를 지정하는데 1~125 범위의 값이어야 합니다.
정수명 |
값 |
의미 |
VK_LBUTTON |
01 |
마우스왼쪽 버튼 |
VK_RBUTTON |
02 |
마우스 오른쪽 버튼 |
VK_CANCEL |
03 |
[Cancel] |
VK_MBUTTON |
04 |
마우스 중앙 버튼 |
VK_XBUTTON1 |
05 |
Windows 2000/XP: 마우스 X1 버튼 |
VK_XBUTTON2 |
06 |
Windows 2000/XP: 마우스 X2 버튼 |
- |
07 |
미정도리 |
VK_BACK |
08 |
[Back space] |
VK_TAB |
09 |
[Tab] |
- |
0A ~ 0B |
예약 |
VK_CLEAR |
0C |
[Clear] |
VK_RETURN |
0D |
[Enter] |
- |
0E ~ 0F |
미정도리 |
VK_SHIFT |
10 |
[Shift] |
VK_CONTROL |
11 |
[Ctrl] |
VK_MENU |
12 |
[Alt] |
VK_PAUSE |
13 |
[Pause] |
VK_CAPITAL |
14 |
[Caps Lock] |
VK_KANA |
15 |
IME 가나 모드 |
VK_HANGUEL, VK_HANGUL |
15 |
IME 한글 모드 |
- |
16 |
미정도리 |
VK_JUNJA |
17 |
VK_FINAL |
18 |
VK_HANJA |
19 |
VK_KANJI |
19 |
IME 한자 모드 |
- |
1A |
미정도리 |
VK_ESCAPE |
1B |
[Esc] |
VK_CONVERT |
1C |
IME 변환 |
VK_NONCONVERT |
1D |
IME 무변환 |
VK_ACCEPT |
1E |
VK_MODECHANGE |
1F |
IME 모드 변경 |
VK_SPACE |
20 |
스페이스 키 |
VK_PRIOR |
21 |
[Page Up] |
VK_NEXT |
22 |
[Page Down] |
VK_END |
23 |
[End] |
VK_HOME |
24 |
[Home] |
VK_LEFT |
25 |
[←] |
VK_UP |
26 |
[↑] |
VK_RIGHT |
27 |
[→] |
VK_DOWN |
28 |
[↓] |
VK_SELECT |
29 |
[Select] |
VK_PRINT |
2A |
[Print] |
VK_EXECUTE |
2B |
[Execute] |
VK_SNAPSHOT |
2C |
[Print Screen] |
VK_INSERT |
2D |
[Insert] |
VK_DELETE |
2E |
[Delete] |
VK_HELP |
2F |
[Help] |
(ASCII 코드 '0' ~ '9' (와)과 같다) |
30 ~ 39 |
[0] ~ [9] |
3A ~ 40 |
미정도리 |
(ASCII 코드 'A' ~ 'Z' (와)과 같다) |
41 ~ 5A |
[A] ~ [Z] |
VK_LWIN |
5B |
왼쪽의 Windows 키 |
VK_RWIN |
5C |
오른쪽의 Windows 키 |
VK_APPS |
5D |
어플리케이션 키 |
- |
5E |
예약 |
VK_SLEEP |
5F |
컴퓨터 sleeve 키 |
VK_NUMPAD0 ~ VK_NUMPAD9 |
60 ~ 69 |
숫자 패드의 [0] ~ [9] |
VK_MULTIPLY |
6A |
숫자 패드의 [ * ] |
VK_ADD |
6B |
숫자 패드의 [ + ] |
VK_SEPARATOR |
6C |
숫자 패드의 [Enter] |
VK_SUBTRACT |
6D |
숫자 패드의 [ - ] |
VK_DECIMAL |
6E |
숫자 패드의 [ . ] |
VK_DIVIDE |
6F |
숫자 패드의 [ / ] |
VK_F1 |
70 |
[F1] |
VK_F2 |
71 |
[F2] |
VK_F3 |
72 |
[F3] |
VK_F4 |
73 |
[F4] |
VK_F5 |
74 |
[F5] |
VK_F6 |
75 |
[F6] |
VK_F7 |
76 |
[F7] |
VK_F8 |
77 |
[F8] |
VK_F9 |
78 |
[F9] |
VK_F10 |
79 |
[F10] |
VK_F11 |
7A |
[F11] |
VK_F12 |
7B |
[F12] |
VK_F13 |
7C |
[F13] |
VK_F14 |
7D |
[F14] |
VK_F15 |
7E |
[F15] |
VK_F16 |
7F |
[F16] |
VK_F17 |
80 |
[F17] |
VK_F18 |
81 |
[F18] |
VK_F19 |
82 |
[F19] |
VK_F20 |
83 |
[F20] |
VK_F21 |
84 |
[F21] |
VK_F22 |
85 |
[F22] |
VK_F23 |
86 |
[F23] |
VK_F24 |
87 |
[F24] |
- |
88 ~ 8F |
할당해 없음 |
VK_NUMLOCK |
90 |
[Num Lock] |
VK_SCROLL |
91 |
[Scroll Lock] |
92 ~ 96 |
OEM 고유 |
97 ~ 9F |
할당 없음 |
VK_LSHIFT |
A0 |
왼쪽의 [Shift] |
VK_RSHIFT |
A1 |
오른쪽의 [Shift] |
VK_LCONTROL |
A2 |
왼쪽의 [Ctrl] |
VK_RCONTROL |
A3 |
오른쪽의 [Ctrl] |
VK_LMENU |
A4 |
왼쪽의 [Alt] |
VK_RMENU |
A5 |
오른쪽의 [Alt] |
VK_BROWSER_BACK |
A6 |
Windows 2000/XP: 브라우저의 「돌아온다」키 |
VK_BROWSER_FORWARD |
A7 |
Windows 2000/XP: 브라우저의 「다음에」키 |
VK_BROWSER_REFRESH |
A8 |
Windows 2000/XP: 브라우저의 「갱신」키 |
VK_BROWSER_STOP |
A9 |
Windows 2000/XP: 브라우저의 「중지」키 |
VK_BROWSER_SEARCH |
AA |
Windows 2000/XP: 브라우저의 「검색」키 |
VK_BROWSER_FAVORITES |
AB |
Windows 2000/XP: 브라우저의 「마음에 드는 것」키 |
VK_BROWSER_HOME |
AC |
Windows 2000/XP: 브라우저의 「홈」키 |
VK_VOLUME_MUTE |
AD |
Windows 2000/XP: 볼륨의 뮤트 키 |
VK_VOLUME_DOWN |
AE |
Windows 2000/XP: 볼륨 다운 키 |
VK_VOLUME_UP |
AF |
Windows 2000/XP: 볼륨 업 키 |
VK_MEDIA_NEXT_TRACK |
B0 |
Windows 2000/XP: 「다음의 트럭」키 |
VK_MEDIA_PREV_TRACK |
B1 |
Windows 2000/XP: 「전의 트럭」키 |
VK_MEDIA_STOP |
B2 |
Windows 2000/XP: 「미디어 정지」키 |
VK_MEDIA_PLAY_PAUSE |
B3 |
Windows 2000/XP: 「미디어 Start / Stop 」키 |
VK_LAUNCH_MAIL |
B4 |
Windows 2000/XP: 「메일 개시」키 |
VK_LAUNCH_MEDIA_SELECT |
B5 |
Windows 2000/XP: 「미디어 선택」키 |
VK_LAUNCH_APP1 |
B6 |
Windows 2000/XP: 「어플리케이션 1 기동」키 |
VK_LAUNCH_APP2 |
B7 |
Windows 2000/XP: 「어플리케이션 2 기동」키 |
B8 ~ B9 |
예약 |
VK_OEM_1 |
BA |
다양한 문자를 위해서 사용할 수 있습니다.
Windows 2000/XP: U.S. 표준 키보드에서는 [ :; ] |
VK_OEM_PLUS |
BB |
Windows 2000/XP: [ + ] |
VK_OEM_COMMA |
BC |
Windows 2000/XP: [ , ] |
VK_OEM_MINUS |
BD |
Windows 2000/XP: [ - ] |
VK_OEM_PERIOD |
BE |
Windows 2000/XP: [ . ] |
VK_OEM_2 |
BF |
다양한 문자를 위해서 사용할 수 있습니다.
Windows 2000/XP: U.S. 표준 키보드에서는 [ /? ] |
VK_OEM_3 |
C0 |
다양한 문자를 위해서 사용할 수 있습니다.
Windows 2000/XP: U.S. 표준 키보드에서는 [ `~ ] |
C1 ~ D7 |
예약 |
D8 ~ DA |
할당 없음 |
VK_OEM_4 |
DB |
다양한 문자를 위해서 사용할 수 있습니다.
Windows 2000/XP: U.S. 표준 키보드에서는 [ [{ ] |
VK_OEM_5 |
DC |
다양한 문자를 위해서 사용할 수 있습니다.
Windows 2000/XP: U.S. 표준 키보드에서는 [ \| ] |
VK_OEM_6 |
DD |
다양한 문자를 위해서 사용할 수 있습니다.
Windows 2000/XP: U.S. 표준 키보드에서는 [ ]} ] |
VK_OEM_7 |
DE |
다양한 문자를 위해서 사용할 수 있습니다.
Windows 2000/XP: U.S. 표준 키보드에서는 [ '" ] |
VK_OEM_8 |
DF |
다양한 문자를 위해서 사용할 수 있습니다. |
- |
E0 |
예약 |
E1 |
OEM 고유 |
VK_OEM_102 |
E2 |
Windows 2000/XP: RT 102-key 키보드의 모퉁이 외모 또는 backslash |
E3 ~ E4 |
OEM 고유 |
VK_PROCESSKEY |
E5 |
Windows 95/98/Me/NT 4.0/2000/XP: IME Process |
E6 |
OEM 고유 |
VK_PACKET |
E7 |
Windows 2000/XP: Unicode 문자가 키스트로크(keystroke)인 것 같이 통하기 위해서 사용됩니다. |
- |
E8 |
할당해 없음 |
E9 ~ F5 |
OEM 고유 |
VK_ATTN |
F6 |
Attn |
VK_CRSEL |
F7 |
CrSel |
VK_EXSEL |
F8 |
ExSel |
VK_EREOF |
F9 |
Erase EOF |
VK_PLAY |
FA |
Play |
VK_ZOOM |
FB |
Zoom |
VK_NONAME |
FC |
예약 |
VK_PA1 |
FD |
PA1 |
VK_OEM_CLEAR |
FE |
Clear |
bScan
사용하지 않는 인자 입니다.
dwFlags
함수의 동작을 지정하는데 0을 넣을 경우 KeyDown이고 0x0002를 넣을 경우 KeyUP 입니다.
dwExtraInfo
키스트로크 관련 32비트의 추가 정보를 지정 한다고 합니다.
C#에서 사용시!
[DllImport("user32.dll)]
public static extern void Keybd_event(byte vk, byte scan, int flags, ref int extrainfo);
※ ex)
const byte AltKey = 18;
const int KEYUP = 0x0002;
int Info=0;
keybd_event(AltKey, 0, 0, ref Info); // ALT key 다운
keybd_event(AltKey, 0, KEYUP, ref Info); // ALT key 업