4-1-´Ù. WM_KEYDOWN

Å°º¸µå·ÎºÎÅÍ ¹®ÀÚ¸¦ ÀԷ¹ްíÀÚ ÇÒ °æ¿ì´Â WM_CHAR ¸Þ½ÃÁö¸¦ »ç¿ëÇÏ¸é µÈ´Ù´Â °ÍÀ» ¹è¿ü´Ù. ¹®ÀÚ ÀÌ¿ÜÀÇ Å°¸¦ ÀÔ·Â ¹ÞÀ¸·Á¸é WM_CHAR ¸Þ½ÃÁö¸¸À¸·Î´Â ÀÔ·ÂÀ» ¹ÞÀ» ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î Ä¿¼­ À̵¿Å°¶óµç°¡ Ins, Del, PgUp, Æã¼ÇÅ° µîÀÇ Å°´Â ¹®ÀÚÅ°°¡ ¾Æ´Ï±â ¶§¹®¿¡ WM_CHAR ¸Þ½ÃÁö·Î´Â °ËÃâÇØ ³¾ ¼ö ¾ø´Ù. À̶§´Â WM_KEYDOWN ¸Þ½ÃÁö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

WM_KEYDOWN ¸Þ½ÃÁö´Â wParam¿¡ ¹®ÀÚ Äڵ尡 ¾Æ´Ñ °¡»ó Å°ÄÚµå¶ó´Â °ÍÀ» Àü´ÞÇØ ÁØ´Ù. °¡»óÅ°ÄÚµå(Virtual Key Code)¶õ ½Ã½ºÅÛ¿¡ ÀåÂøµÈ Å°º¸µåÀÇ Á¾·ù¿¡ »ó°ü¾øÀÌ Å°¸¦ ÀԷ¹ޱâ À§ÇØ ¸¸µé¾îÁø Äڵ尪ÀÌ¸ç ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

°¡»óÅ° ÄÚµå °ª Å°
VK_BACK 08 Backspace
VK_TAB 09 Tab
VK_RETURN 0D Enter
VK_SHIFT 10 Shift
VK_CONTROL 11 Ctrl
VK_MENU 12 Alt
VK_PAUSE 13 Pause
VK_CAPITAL 14 Caps Lock
VK_ESCAPE 1B Esc
VK_SPACE 20 ½ºÆäÀ̽º
VK_PRIOR 21 PgUp
VK_NEXT 22 PgDn
VK_END 23 End
VK_HOME 24 Home
VK_LEFT 25 ÁÂÃø Ä¿¼­ À̵¿Å°
VK_UP 26 À§ÂÊ Ä¿¼­ À̵¿Å°
ÀÌÇÏ»ý·«   ÀÌÇÏ»ý·«

WM_KEYDOWN ¸Þ½ÃÁö°¡ ¹ß»ýÇß°í wParamÀ¸·Î VK_HOMEÀÌ Àü´ÞµÇ¾úÀ¸¸é »ç¿ëÀÚ°¡ HomeÅ°¸¦ ´©¸¥ °ÍÀÌ´Ù. ¼ýÀÚ ¹× ¿µ¹®ÀÚÀÇ °¡»ó Å°ÄÚµå´Â ¾Æ½ºÅ° ÄÚµå¿Í °°À¸¸ç ¸ÅÅ©·Î »ó¼ö´Â Á¤ÀǵǾî ÀÖÁö ¾ÊÀ¸¹Ç·Î ¾Æ½ºÅ° ÄÚµå¿Í wParamÀ» ¹Ù·Î ºñ±³ÇÏ¸é µÈ´Ù.

°¡»ó Å° ÄÚµå´Â Áö±Ý±îÁö ³ª¿Â ¸ðµç Å°º¸µå´Â ¹°·ÐÀÌ°í ¾ÕÀ¸·Î ¸¸µé¾îÁú Å°º¸µå±îÁö °í·ÁÇÏ¿© ¸¸µé¾îÁø ¹ü¿ëÀûÀÎ ÄÚµåÀÌ´Ù. ÄÚµåÇ¥¸¦ º¸¸é VK_SELECT, VK_EXECUTE, VK_HELP µî°ú °°ÀÌ ÇöÀç 101Å°¿¡ ¾ø´Â Å°°ªµµ ¹Ì¸® Á¤ÀǵǾî ÀÖÀ¸¸ç Æã¼ÇÅ°µµ F16±îÁö ¹Ì¸® ¸¸µé¾î ³õ¾Ò´Ù. ÀÌ¿Ü Çѱ¹°ú ÀϺ» µîÀÇ 2¹ÙÀÌÆ® ¹®ÀÚ¸¦ Áö¿øÇϱâ À§ÇÑ Æ¯¼öÇÑ °¡»óÅ°±îÁö Æ÷ÇԵǾî Àִµ¥ °¡»ó Å° Äڵ带 ÀÌ·¸°Ô ¹ü¿ëÀûÀ¸·Î ¸¸µé¾î ³õÀº ÀÌÀ¯´Â ¾ÕÀ¸·Î À©µµ¿ìÁ ´Ù¸¥ ½Ã½ºÅÛÀ¸·Î À̽ÄÇÏ´õ¶óµµ Å° Äڵ带 ±×´ë·Î ¾µ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÑ ¹è·ÁÀÌ´Ù.

WM_KEYDOWN ¸Þ½ÃÁö ó¸® ·çƾ¿¡¼­ wParamÀÇ °ª°ú °¡»ó Å°Äڵ尪À» ºñ±³ÇØ º½À¸·Î½á ¾î¶² Å°°¡ ´­·¯Á³´ÂÁö¸¦ ±¸ºÐÇÑ´Ù. lParamÀ¸·Î Àü´ÞµÇ´Â °ªÀº WM_CHAR¿Í µ¿ÀÏÇϳª ¿ª½Ã Àß »ç¿ëµÇÁö ¾Ê´Â´Ù.

´ÙÀ½ÀÇ KeyDown¿¹Á¦´Â Ä¿¼­ À̵¿Å°¸¦ °ËÃâÇÏ¿© ¹®ÀÚ "A"¸¦ È­¸é¿¡¼­ »óÇÏÁ¿ì·Î À̵¿ÇÏ´Â ¿¹Á¦ÀÌ´Ù. ¼Ò½º¸¦ ÀÔ·ÂÇغ¼ ÇÊ¿ä¾øÀÌ ´«À¸·Î º¸±â¸¸ Çصµ ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="KeyDown";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
		  ,LPSTR lpszCmdParam,int nCmdShow)
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst=hInstance;
	
	WndClass.cbClsExtra=0;
	WndClass.cbWndExtra=0;
	WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	WndClass.hInstance=hInstance;
	WndClass.lpfnWndProc=(WNDPROC)WndProc;
	WndClass.lpszClassName=lpszClass;
	WndClass.lpszMenuName=NULL;
	WndClass.style=CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&WndClass);

	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		  NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	
	while(GetMessage(&Message,0,0,0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static int x=100;
	static int y=100;
	switch(iMessage) {
	case WM_KEYDOWN:
		switch(wParam) {
		case VK_LEFT:
			x-=8;
			break;
		case VK_RIGHT:
			x+=8;
			break;
		case VK_UP:
			y-=8;
			break;
		case VK_DOWN:
			y+=8;
			break;
		}
		InvalidateRect(hWnd,NULL,TRUE);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd,&ps);
		TextOut(hdc,x,y,"A",1);
		EndPaint(hWnd,&ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

x,y¶ó´Â Á¤¼öÇü º¯¼ö µÎ °³¸¦ 100À¸·Î ÃʱâÈ­ ÇÏ°í WM_PAINT ¸Þ½ÃÁö¿¡¼­ ÀÌ º¯¼öÀÇ À§Ä¡¿¡ ¹®ÀÚ "A"¸¦ Ãâ·ÂÇÑ´Ù. WM_KEYDOWN ¸Þ½ÃÁö¿¡¼­´Â wParamÀ» Àоî Ä¿¼­ À̵¿Å°ÀÏ °æ¿ì x,y°ªÀ» Ä¿¼­ À̵¿Å°ÀÇ ¹æÇâ¿¡ µû¶ó Á¶Á¤ÇÔÀ¸·Î½á "A"¸¦ È­¸é¿¡¼­ À̵¿½ÃŲ´Ù. ¹°·Ð WM_KEYDOWN¿¡¼­ ÁÂÇ¥¸¦ Á¶Á¤ÇÑ ÈÄ´Â ¹Ýµå½Ã È­¸é¿¡ ÁÂÇ¥ Á¶Á¤ÀÌ ¹Ý¿µµÇµµ·Ï InvalidateRect ÇÔ¼ö¸¦ È£ÃâÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÇÁ·Î±×·¥ ½ÇÇàÁßÀÇ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù.

Å°º¸µå¸¦ ´©¸¦ ¶§¸¶´Ù °¡»ó Å°Äڵ带 Á¡°ËÇÏ¿© Ä¿¼­ À̵¿Å°¿¡ µû¶ó x,y ÁÂÇ¥°ªÀ» Á¶Á¤ÇÑ ÈÄ È­¸éÀ» ´Ù½Ã ±×¸®°í ÀÖ´Ù. À̶§ È­¸éÀ» ´Ù½Ã ±×¸®±â À§ÇØ InvaludateRect ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ¼¼¹ø° Àμö¿¡ TRUE¸¦ ÁÖ¾î ¹è°æÀ» Áö¿ìµµ·Ï ÇÏ¿´´Ù. ¸¸¾à ÀÌ Àμö¸¦ FALSE·Î º¯°æÇØ ÁÖ¸é ¾î¶»°Ô µÉ±î? Á÷Á¢ ½ÇÇàÇØ º¸¸é ¾Ë°ÚÁö¸¸ A¹®ÀÚ°¡ À̵¿Àº ÇÏÁö¸¸ ±âÁ¸ Ãâ·ÂµÈ A¹®ÀÚ°¡ Áö¿öÁöÁö´Â ¾Ê´Â´Ù.

ÀÌ ¿¹¸¦ ÅëÇØ InvalidateRectÀÇ ¼¼¹ø° Àμö°¡ ¾î¶² ¿ªÇÒÀ» ÇÏ´ÂÁö ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. WM_KEYDOWNÀÇ ¹Ý´ë ¸Þ½ÃÁö´Â WM_KEYUPÀ̸ç Å°°¡ ¶³¾îÁú ¶§ ¹ß»ýÇÑ´Ù. wParam, lParamÀÇ Àǹ̴ WM_KEYDOWN°ú µ¿ÀÏÇÏ´Ù. º°·Î Àß »ç¿ëµÇÁö ¾Ê´Â ¸Þ½ÃÁöÀÌ´Ù.


¸ñ·Ï º¸±â  ´ÙÀ½ °­Á            written by http://www.winapi.co.kr