À©µµ¿ì ÇÁ·Î±×·¡¹Ö ÀÚ·á

HomePage Backward Forward Post Reply List
Delete Modify
  Á¦¸ñ   [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);
}



HomePage Backward Forward Post Reply List
1998 by swindler