À©µµ¿ì ÇÁ·Î±×·¡¹Ö ÀÚ·á |
---|
Á¦¸ñ | [API] Key ó¸® 1998/07/14 (08:55) |
À̸§ | ±èÈ¿¿ø |
¹øÈ£ | 21 |
Á¶È¸ | 373 |
º»¹® |
<< Å°º¸µå >> Å°¸¦ ´©¸¦¶§ ¹ß»ýÇÏ´Â À̺¥Æ® : WM_KEYDOWN or WM_SYSKEYDOWN Å°¸¦ ¶¿¶§ ¹ß»ýÇÏ´Â À̺¥Æ® : WM_KEYUP or WM_SYSKEYUP SYS ´Â º¸Åë System Key¸¦ ³ªÅ¸³»¸é, Alt Å°¿Í ÇÔ²² ÀԷµǴ ŰµéÀÌ ÇØ´çµÈ´Ù. ÀÌ´Â º¸Åë ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ, À©µµ¿ì ÀÚü¿¡ ÀÇÇÏ¿© »ç¿ëµÇ¹Ç·Î, ÀÀ¿ëÇÁ·Î±×·¥ ¿¡¼´Â ¸Þ½ÃÁö¸¦ ¹«½ÃÇÏ°í, DefWindowProc¿¡ ³Ñ°ÜÁØ´Ù. << lParam º¯¼ö (32bit) >> 00-15 bit : Repeat Count 16-23 bit : 8-Bit OEM Scan Code 24 bit : Extended Key Flag 29 bit : Context Code 30 bit : Previous Key State 31 bit : Transition State Repeat Count : ÇÁ·Î±×·¥ÀÌ Å° ´·ÁÁü ¸Þ½ÃÁö¸¦ ÃæºÐÈ÷ ºü¸£°Ô ó¸®ÇÏÁö ¸øÇÒ¶§ ¹ß»ý. ¹öÆÛ¿¡ ½×ÀÎ Å° ÀÔ·ÂÀ¸·Î ÀÎÇØ ¿øÇÏÁö ¾Ê´Â ½ºÅ©·Ñ¸µµîÀÌ ¹ß»ýÇÏ´Â °æ¿ì°¡ ÀÖÀ½. Repeat Count°¡ 1ÀÌ»óÀÎ °æ¿ì¿¡, ó¸® À¯¹«¿¡ ´ëÇؼ´Â »ý°¢Çغ¼ ÇÊ¿ä°¡ ÀÖÀ½. OEM Scan Code : Keyboard Scan Code, À©µµ¿ì¿¡¼´Â º¸Åë ¹«½Ã Extended Key Flag : È®ÀåÅ°ÀÇ °æ¿ì¿¡ 1·Î ¼³Á¤. (F1,F2,,,Alt, Ctrl, Insert..) ÀϹÝÀûÀ¸·Î À©µµ¿ì ÇÁ·Î±×·¥¿¡¼´Â ¹«½Ã Context Code : AltÅ°°¡ ´·¯Áö¸é 1·Î ¼³Á¤. ¿¹¿Ü1) È°¼ºÃ¢ÀÌ ¾ÆÀÌÄÜ »óÅÂÀ϶§´Â ÀÔ·Â Æ÷Ä¿½º°¡ ¾øÀ¸¹Ç·Î, ¸ðµç Å° ÀÔ·ÂÀÌ WM_SYSKEY ·Î ¹ß»ýµÈ´Ù. À̶§ Alt¿¡ µû¶ó¼, Context Code´Â 1¶Ç´Â 0ÀÌ´Ù. ¿¹¿Ü2) ¾î¶² Å°º¸µå¿¡¼´Â ÀÓÀÇ Å°¿Í Alt, Ctrl, ShiftµîÀÇ Á¶ÇÕ¿¡ ÀÇÇÏ¿© ÀÓÀÇ ¹®ÀÚ¸¦ ¸¸µç´Ù. ÀÌ °æ¿ì¿¡´Â WM_KEY°¡ ¹ß»ýµÇÁö¸¸, Context Code´Â 1ÀÌ´Ù. Previous Key State : ¾î¶² Å°°¡ ´·ÁÁöÁö ¾Ê¾ÒÀ» °æ¿ì¿¡ 0, ´·ÁÁ³À» °æ¿ì 1 WM_KEYUP, WM_SYSKEYUPÀÇ °æ¿ì´Â Ç×»ó 1, WM_KEYDOWN, WM_SYSKEYDOWNÀÇ °æ¿ì´Â 0Àϼöµµ 1Àϼöµµ ÀÖÀ½. 1ÀÎ °æ¿ì´Â µÎ¹ø°ºÎÅÍ ¿¬¼ÓµÈ ¸Þ½ÃÁö°¡ Å°¸¦ °è¼Ó ´©¸§À¸·Î ¹ß»ý. Transition State : Å°³ª ´·ÁÁö´Â ¼ø°£¿¡´Â 0, ¶¼Áö´Â ¼ø°£¿¡´Â 1 << wParam >> ½ÇÁúÀûÀ¸·Î´Â lParamº¸´Ù´Â wParam¿¡ µé¾î¿À´Â °¡»ó Å°½ºÆ®·ÎÅ© ¸Þ½ÃÁö°¡ ÈÙ¾À Áß¿ä ex) VK_LBUTTON, VK_BACK, VK_SHIFT VK_PRIOR : PageUp Key << Shift »óÅ ¾ò±â >> GetKeyStateÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¾î¶² °¡»ó Å°ÀÇ »óŸ¦ ¾òÀ½. GetKeyState(VK_SHIFT); : ShiftÅ°°¡ ´·ÁÁø °æ¿ì À½¼ö°ª(»óÀ§ ºñÆ®°¡ ¼³Á¤)À» µÇµ¹¸² GetKeyState(VK_CAPITAL); : CapsLockÅ°°¡ Åä±Û»óŶó¸é ÇÏÀ§ ºñÆ®°¡ ¼³Á¤ GetKeyState´Â ½Ç½Ã°£ Å°º¸µå »óÅ üũ ÇÔ¼ö°¡ ¾Æ´Ï¶ó, ÇöÀç ¸Þ½ÃÁö°¡ 󸮵ǰí ÀÖ´Â ¼ø°£ÀÇ Å° »óŸ¦ üũ. GetAsyncKeyState°¡ ÇöÀç ½Ã°¢ÀÇ Å° »óŸ¦ ¹Ýȯ << Typer ¿¹Á¦ >> #include <windows.h> #include <stdlib.h> #define BUFFER(x,y) *(pBuffer+y*cxBuffer+x) LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow) { static char szAppName[]="Typer"; HWND hwnd; MSG msg; WNDCLASSEX wndclass; wndclass.cbSize=sizeof(wndclass); wndclass.style=CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szAppName; wndclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wndclass); hwnd=CreateWindow(szAppName,"Typing Program", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL,hInstance,NULL); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static char *pBuffer=NULL; static int cxChar, cyChar, cxClient, cyClient,cxBuffer,cyBuffer, xCaret, yCaret; HDC hdc; int x,y,i; PAINTSTRUCT ps; TEXTMETRIC tm; switch(iMsg) { case WM_CREATE: hdc=GetDC(hwnd); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); GetTextMetrics(hdc,&tm); cxChar=tm.tmAveCharWidth; cyChar=tm.tmHeight; ReleaseDC(hwnd,hdc); return 0; case WM_SIZE: cxClient=LOWORD(lParam); cyClient=HIWORD(lParam); cxBuffer=max(1,cxClient/cxChar); cyBuffer=max(1,cyClient/cyChar); if(pBuffer!=NULL) free(pBuffer); if((pBuffer=(char *)malloc(cxBuffer* cyBuffer))==NULL) MessageBox(hwnd,"Window too large. Cannot" "allocate enough memory","Typer", MB_ICONEXCLAMATION | MB_OK); else for(y=0;y<cyBuffer;y++) for(x=0;x<cxBuffer;x++) BUFFER(x,y)=' '; xCaret=0; yCaret=0; if(hwnd==GetFocus()) SetCaretPos(xCaret *cxChar, yCaret*cyChar); return 0; case WM_SETFOCUS: CreateCaret(hwnd,NULL,cxChar,cyChar); SetCaretPos(xCaret*cxChar, yCaret*cyChar); ShowCaret(hwnd); return 0; case WM_KILLFOCUS: HideCaret(hwnd); DestroyCaret(); return 0; case WM_KEYDOWN: switch(wParam) { case VK_HOME: xCaret=0; break; case VK_END: xCaret=cxBuffer-1; break; case VK_PRIOR: yCaret=0; break; case VK_NEXT: yCaret=cyBuffer-1; break; case VK_LEFT: xCaret=max(xCaret-1,0); break; case VK_RIGHT: xCaret=min(xCaret+1,cxBuffer-1); break; case VK_UP: yCaret=max(yCaret-1,0); break; case VK_DOWN: yCaret=min(yCaret+1, cyBuffer-1); break; case VK_DELETE: for(x=xCaret;x<cxBuffer-1;x++) BUFFER(x,yCaret)=BUFFER(x+1,yCaret); BUFFER(cxBuffer-1,yCaret)=' '; HideCaret(hwnd); hdc=GetDC(hwnd); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); TextOut(hdc,xCaret*cxChar, yCaret*cyChar, & BUFFER(xCaret, yCaret), cxBuffer-xCaret); ShowCaret(hwnd); ReleaseDC(hwnd,hdc); break; } SetCaretPos(xCaret*cxChar, yCaret*cyChar); return 0; case WM_CHAR: for(i=0;i<(int)LOWORD(lParam);i++) { switch(wParam) { case '\b': if(xCaret>0) { xCaret--; SendMessage(hwnd,WM_KEYDOWN,VK_DELETE,1L); } break; case '\t': do { SendMessage(hwnd,WM_CHAR,' ',1L); } while(xCaret %8 !=0); break; case '\n': if(++yCaret==cyBuffer) yCaret=0; break; case '\r': xCaret=0; if(++yCaret==cyBuffer) yCaret=0; break; case '\x1B': for(y=0;y<cyBuffer;y++) for(x=0;x<cxBuffer;x++) BUFFER(x,y)=' '; xCaret=0; yCaret=0; InvalidateRect(hwnd,NULL,FALSE); break; default: BUFFER(xCaret, yCaret)=(char) wParam; HideCaret(hwnd); hdc=GetDC(hwnd); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); TextOut(hdc,xCaret*cxChar, yCaret*cyChar, &BUFFER(xCaret,yCaret),1); ShowCaret(hwnd); ReleaseDC(hwnd,hdc); if(++xCaret==cxBuffer) { xCaret=0; if(++yCaret==cyBuffer) yCaret=0; } break; } } SetCaretPos(xCaret*cxChar,yCaret*cyChar); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); for(y=0;y<cyBuffer;y++) TextOut(hdc,0,y*cyChar, &BUFFER(0,y),cxBuffer); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,iMsg,wParam, lParam); } |