본문 바로가기
[ Program ]/C#

키 이벤트 발생 시키기 - keybd_event()

by 관이119 2012. 9. 17.

프로젝트 도중 키 이벤트를 강제로 발생시켜야 하는 상황이 생겼는데요;;
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 업

댓글