WM_SYSCOMMAND

Àμö

wParam : ½Ã½ºÅÛ ¸í·ÉÀÇ Á¾·ù°¡ Àü´ÞµÇ¸ç »ç¿ëÀÚ°¡ ½Ã½ºÅÛ ¸Þ´º¿¡¼­ ¾î¶² Ç׸ñÀ» ¼±ÅÃÇß´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù. ÀÌ °ªÀÇ ÇÏÀ§ 4ºñÆ®´Â ½Ã½ºÅÛÀÌ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â °ªÀ̹ǷΠ¸í·ÉÀÇ Á¾·ù¸¦ ¾Ë°í ½ÍÀ¸¸é wParamÀ» 0xFFF0¿Í AND¿¬»êÇØ¾ß ÇÑ´Ù. ¿¬»êÇÑ °á°ú´Â ´ÙÀ½°ª ÁßÀÇ Çϳª°¡ µÈ´Ù.

»ó¼ö °ª

¼³¸í

SC_CLOSE

0xF060

À©µµ¿ì¸¦ ´Ý´Â´Ù.

SC_CONTEXTHELP

0xF180

»óȲº° µµ¿ò¸» Ãâ·Â »óÅ°¡ µÇ¸ç Ä¿¼­¿¡ ?Ç¥½Ã¸¦ Ãâ·ÂÇÏ°í »ç¿ëÀÚ°¡ ´ëÈ­»óÀÚ ÄÁÆ®·ÑÀ» Ŭ¸¯Çϸé WM_HELP ¸Þ½ÃÁö¸¦ º¸³½´Ù.

SC_DEFAULT

0xF160

µðÆúÆ® ¸Þ´º Ç׸ñÀ» ¼±ÅÃÇ߰ųª ½Ã½ºÅÛ ¸Þ´º¸¦ ´õºíŬ¸¯Çß´Ù.

SC_HOTKEY

0xF150

ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á¤ÀÇÇÑ ÇÖÅ°·Î À©µµ¿ì¸¦ È°¼ºÈ­¿´´Ù.

SC_HSCROLL

0xF080 ¼öÆòÀ¸·Î ½ºÅ©·ÑÇÑ´Ù.

SC_KEYMENU

0xF100

Å°º¸µå ÀÔ·ÂÀ¸·Î ½Ã½ºÅÛ ¸Þ´º¸¦ È£ÃâÇÏ¿´´Ù. º¸Åë Alt+Space°¡ ½Ã½ºÅÛ ¸Þ´º Ãâ·ÂÅ°ÀÌ´Ù. ¶Ç´Â AltÅ°¿Í ´ÜÃàÅ°¸¦ °°ÀÌ ´©¸¦ ¶§µµ ÀÌ ¸í·ÉÀÌ Àü´ÞµÇ´Âµ¥ À̶§ lParamÀº ´ÜÃàÅ° ¹®ÀÚ°ªÀÌ Àü´ÞµÈ´Ù. ¿¹¸¦ µé¾î Alt+H¸¦ ´©¸£¸é lParam¿¡´Â 'h'°¡ Àü´ÞµÈ´Ù.

SC_MAXIMIZE

0xF030 À©µµ¿ì¸¦ ÃÖ´ëÈ­ÇÏ¿´´Ù.

SC_MINIMIZE

0xF020 À©µµ¿ì¸¦ ÃÖ¼ÒÈ­ÇÏ¿´´Ù.

SC_MONITORPOWER

0xF170 Ãâ·ÂÀåÄ¡ÀÇ »óŸ¦ ¼³Á¤ÇÑ´Ù. ÀÌ ¸í·ÉÀº Àü¿ø Àý¾à ±â´ÉÀÌ ÀÖ´Â ÄÄÇ»ÅÍÀÇ Àü¿ø Àý¾à ±â´ÉÀ» Áö¿øÇÑ´Ù. lParamÀÌ 1À̸é ÀúÀü·Â »óÅ°¡ µÈ °ÍÀ̸ç 2À̸é Àü¿øÀÌ Â÷´ÜµÈ °ÍÀÌ´Ù.

SC_MOUSEMENU

0xF090 ¸¶¿ì½º Ŭ¸¯À¸·Î ½Ã½ºÅÛ ¸Þ´º¸¦ Ãâ·ÂÇÏ¿´´Ù.

SC_MOVE

0xF010 À̵¿ Ç׸ñÀ» ¼±ÅÃÇÏ¿© À©µµ¿ì¸¦ À̵¿½ÃŲ´Ù.

SC_NEXTWINDOW

0xF040 ´ÙÀ½ À©µµ¿ì·Î À̵¿ÇÏ¿´´Ù.

SC_PREVWINDOW

0xF050 ÀÌÀü À©µµ¿ì·Î À̵¿ÇÏ¿´´Ù.

SC_RESTORE

0xF120 ¿ø·¡ À§Ä¡·Î º¹±¸ÇÏ¿´´Ù.

SC_SCREENSAVE

0xF140 ½Ã½ºÅÛ¿¡ µî·ÏµÈ ½ºÅ©¸° ¼¼À̹ö¸¦ ½ÇÇàÇÑ´Ù.

SC_SIZE

0xF000 À©µµ¿ìÀÇ Å©±â¸¦ Á¶Á¤ÇÑ´Ù.

SC_TASKLIST

0xF130 ½ÃÀÛ ¸Þ´º¸¦ È°¼ºÈ­ÇÑ´Ù.

SC_VSCROLL

0xF070 ¼öÁ÷À¸·Î ½ºÅ©·ÑÇÑ´Ù.

°¢ °ªµéÀº ÇØ´ç ¸í·ÉÀÌ ¼±ÅõǾú´Ù´Â ¶æÀÌÁö ÀÌ¹Ì ½ÇÇàµÇ¾ú´Ù´Â ¶æÀÌ ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ°¡ ½Ã½ºÅÛ ¸Þ´º¿¡¼­ 'À̵¿'Ç׸ñÀ» ¼±ÅÃÇϸé SC_MOVE°¡ Àü´ÞµÇ´Âµ¥ À̶§´Â ¾ÆÁ÷ À̵¿À» ½ÃÀÛÇÏÁö ¾ÊÀº »óÅÂÀÌ´Ù.

lParam : ¸¶¿ì½º·Î À©µµ¿ì ¸Þ´º¸¦ ¼±ÅÃÇÑ °æ¿ì Ä¿¼­ÀÇ ÁÂÇ¥°¡ Àü´ÞµÈ´Ù. ÇÏÀ§ ¿öµå¿¡´Â ¼öÆò ÁÂÇ¥, »óÀ§ ¿öµå¿¡´Â ¼öÁ÷ ÁÂÇ¥°¡ Àü´ÞµÇ´Âµ¥ ÀÌ ÁÂÇ¥´Â È­¸é ±âÁØ ÁÂÇ¥ÀÌ´Ù. ¾×¼¿·¯·¹ÀÌÅÍ¿¡ ÀÇÇØ ¸í·ÉÀÌ ¼±ÅõǾúÀ¸¸é -1ÀÌ µÇ¸ç ´Ï¸ð´Ð¿¡ ÀÇÇØ ¼±ÅõǾúÀ¸¸é 0ÀÌ µÈ´Ù.

¼³¸í

½Ã½ºÅÛ ¸Þ´º¿¡ ÀÖ´Â ¸Þ´º Ç׸ñÀ» ¼±ÅÃÇϸé WM_COMMAND ¸Þ½ÃÁö ´ë½Å ÀÌ ¸Þ½ÃÁö°¡ Àü´ÞµÈ´Ù. ½Ã½ºÅÛ ¸Þ´º¸¦ Á÷Á¢ ¼±ÅÃÇÏ´Â µ¿ÀÛ ¿Ü¿¡µµ ŸÀÌƲ ¹Ù¿¡ ÀÖ´Â ÃÖ´ë, ÃÖ¼Ò, ´Ý±â ¹öÆ° µîÀÇ ¸í·Éµéµµ ÀÌ ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŲ´Ù. ½Ã½ºÅÛ ¸Þ´º¿¡ ÀÖ´Â ¸í·ÉµéÀº À©µµ¿ì¸¦ °ü¸®Çϱâ À§ÇÑ ±âº»ÀûÀÎ ¸í·ÉÀ̹ǷΠÀÀ¿ë ÇÁ·Î±×·¥Àº ÀÌ ¸Þ½ÃÁö¸¦ Á÷Á¢ ó¸®ÇÏÁö ¾Ê°í º¸Åë DefWindowProcÀ¸·Î ±×³É º¸³» ÁØ´Ù.

DefWindowProcÀº wParam°ª¿¡ µû¶ó ½Ã½ºÅÛ¿¡ ¹Ì¸® Á¤ÀǵǾî ÀÖ´Â µ¿ÀÛÀ» ¼öÇàÇÑ´Ù. ¿¹¸¦ µé¾î SC_MINIMIZE ½Ã½ºÅÛ ¸í·ÉÀÌ Àü´ÞµÇ¾úÀ¸¸é À©µµ¿ì¸¦ ÃÖ¼ÒÈ­ÇÏ°í SC_CLOSE ¸í·ÉÀÌ Àü´ÞµÇ¾úÀ¸¸é À©µµ¿ì¸¦ ´Ý´Â´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á÷Á¢ ÀÌ ½Ã½ºÅÛ ¸í·ÉÀ» ÇÁ·Î±×·¡¹Ö ÇÏ°í ½Í´Ù¸é ÀÌ ¸Þ½ÃÁö¸¦ ó¸®Çϸç ÀÚ½ÅÀÌ Ã³¸®ÇÑ ½Ã½ºÅÛ ¸í·ÉÀº DefWindowProcÀ¸·Î º¸³»Áö ¸»¾Æ¾ß ÇÑ´Ù. ±×¿ÜÀÇ ½Ã½ºÅÛ ¸í·ÉÀº ¸ðµÎ DefWindowProcÀ¸·Î º¸³» ÁÖ¾î µðÆúÆ® 󸮸¦ Çϵµ·Ï ÇØ¾ß ÇÑ´Ù.

½Ã½ºÅÛ ¸Þ´º¿¡´Â À̵¿, ÃÖ¼ÒÈ­, ÃÖ´ëÈ­, Å©±â Á¶Á¤, ´Ý±â µîÀÇ Ç¥ÁØ À©µµ¿ì °ü¸® ¸í·Éµé¸¸ µé¾î ÀÖ´Ù. GetSystemMenu, AppendMenu µîÀÇ ¸Þ´º °ü·Ã ¸í·ÉÀ» »ç¿ëÇÏ¸é ½Ã½ºÅÛ ¸Þ´º¿¡µµ ÀÀ¿ë ÇÁ·Î±×·¥ °íÀ¯ÀÇ ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ¸¸µé¾îÁø ¸Þ´º Ç׸ñÀ» ¼±ÅÃÇÒ ¶§´Â WM_COMMAND ´ë½Å WM_SYSCOMMAND ¸Þ½ÃÁö°¡ ´ë½Å Àü´ÞµÇ¹Ç·Î ¹Ýµå½Ã ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇØ¾ß ÇÑ´Ù. ÀÌ °æ¿ì Á÷Á¢ Ãß°¡ÇÑ ¸Þ´º Ç׸ñ ¿ÜÀÇ ½Ã½ºÅÛ ¸í·ÉÀº ¸ðµÎ DefWindowProcÀ¸·Î Àü´ÞÇØ ÁÖ¾î¾ß ÇÑ´Ù.

ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½Ã½ºÅÛ ¸í·ÉÀ» Á÷Á¢ ½ÇÇàÇÒ ÇÊ¿ä°¡ ÀÖ´Ù¸é wParam¿¡ ¿øÇÏ´Â ½Ã½ºÅÛ ¸í·ÉÀ» ´ëÀÔÇÏ°í DefWindowProcÀ¸·Î WM_SYSCOMMAND¸¦ º¸³» ÁØ´Ù. ¿¹¸¦ µé¾î À©µµ¿ì¸¦ ´Ý°í ½ÍÀ¸¸é SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); ¸í·ÉÀ» º¸³» ÁÖ¸é µÈ´Ù.

¸®ÅÏ

ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇßÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù.

¿¹Á¦

¿¹Á¦ 1

´ÙÀ½ ¿¹Á¦´Â ½Ã½ºÅÛ ¸í·ÉÀÌ ¾ðÁ¦ È£ÃâµÇ´ÂÁö¸¦ º¸¿© ÁØ´Ù. WM_SYSCOMMAND ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§¸¶´Ù ¾î¶² ¸Þ½ÃÁö¸¦ ¹Þ¾Ò´ÂÁö ±â·ÏÇÏ°í ÀÛ¾÷ ¿µ¿ª¿¡ º¸¿© ÁÜÀ¸·Î½á ½Ã½ºÅÛ ¸í·É ¹æ»ý ½Ã±â¸¦ ÇнÀÇϱâ À§ÇØ Á¦ÀÛÇÏ¿´´Ù.

int y=40;
TCHAR buf[10000];
void PrintMessage(TCHAR *str)
{
	lstrcat(buf,str);
	lstrcat(buf,"\r\n");
	InvalidateRect(hWndMain,NULL,TRUE);
	y+=20;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	TCHAR str[128];
	TCHAR Mes[]="½Ã½ºÅÛ ¸í·É ¸Þ½ÃÁö¸¦ º¸¿© ÁÝ´Ï´Ù";
	RECT crt;

	switch(iMessage) {
	case WM_SYSCOMMAND:
		switch (wParam & 0xFFF0) {
		case SC_CLOSE:
			PrintMessage("SC_CLOSE");
			break;
		case SC_KEYMENU:
			PrintMessage("SC_KEYMENU");
			break;
		case SC_MOVE:
			PrintMessage("SC_MOVE");
			break;
		case SC_MAXIMIZE:
			PrintMessage("SC_MAXIMIZE");
			break;
		case SC_MINIMIZE:
			PrintMessage("SC_MINIMIZE");
			break;
		case SC_MOUSEMENU:
			PrintMessage("SC_MOUSEMENU");
			break;
		case SC_NEXTWINDOW:
			PrintMessage("SC_NEXTWINDOW");
			break;
		case SC_PREVWINDOW:
			PrintMessage("SC_PREVWINDOW");
			break;
		case SC_RESTORE:
			PrintMessage("SC_RESTORE");
			break;
		case SC_SIZE:
			PrintMessage("SC_SIZE");
			break;
		default:
			wsprintf(str, "±×¿ÜÀÇ ½Ã½ºÅÛ ¸í·É. wParam=%X", wParam);
			PrintMessage(str);
			break;
		}
		break;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		GetClientRect(hWnd,&crt);
		crt.top=40;
		crt.left=200;
		DrawText(hdc,buf,-1,&crt,0);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

½ÇÇàÁßÀÇ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù.

Å°º¸µå ¹× ¸¶¿ì½º µîÀ¸·Î ½Ã½ºÅÛ ¸Þ´º¸¦ ¿­¾î º¸°í ŸÀÌƲ ¹ÙÀÇ °¢ ¹öÆ°À» ´­·¯ º¸¸é ¾ðÁ¦ ½Ã½ºÅÛ ¸í·ÉÀÌ ¹ß»ýÇÏ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ¸ðµç ½Ã½ºÅÛ ¸í·ÉÀº DefWindowProcÀ¸·Î º¸³» ÁÖ¾î µðÆúÆ® 󸮸¦ ÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. ¸¸¾à À§ ¼Ò½º¿¡¼­ SC_MOVE¸¦ ¹Þ¾ÒÀ» ¶§ return 0; ÇØ ¹ö¸®¸é À©µµ¿ì À̵¿ÀÌ ºÒ°¡´ÉÇØÁø´Ù.

¿¹Á¦ 2

´ÙÀ½ ¿¹Á¦´Â ½Ã½ºÅÛ ¸Þ´º¿¡ ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÏ°í ÀÌ Ç׸ñÀÌ ¼±ÅõǾúÀ» ¶§¸¦ ó¸®ÇÑ´Ù.

#define IDM_SYS_TEST 41000
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HMENU hSysMenu;

	switch(iMessage) {
	case WM_CREATE:
		hSysMenu=GetSystemMenu(hWnd, FALSE);
		AppendMenu(hSysMenu, MF_STRING, IDM_SYS_TEST, "Å×½ºÆ® Ç׸ñ");
		return 0;
	case WM_SYSCOMMAND:
		switch (LOWORD(wParam)) {
		case IDM_SYS_TEST:
			MessageBox(hWnd, "½Ã½ºÅÛ ¸Þ´º¿¡ ÀÖ´Â Å×½ºÆ® Ç׸ñÀ» ¼±ÅÃÇ߳׿ä.","¾Ë¸²",MB_OK);
			return 0;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

½Ã½ºÅÛ ¸Þ´ºÀÇ Ç׸ñÀº WM_COMMND ¸Þ½ÃÁö ´ë½Å WM_SYSCOMMAND ¸Þ½ÃÁö°¡ ¹ß»ýÇϹǷΠ¹Ýµå½Ã ÀÌ ¸Þ½ÃÁö¿¡¼­ ó¸®ÇØ¾ß ÇÑ´Ù. IDM_SYS_TEST Ç׸ñ ÀÌ¿ÜÀÇ ½Ã½ºÅÛ ¸í·É¿¡ ´ëÇؼ­´Â breakÇÏ¿© DefWindowProcÀ¸·Î ³Ñ°Ü ÁÖ¾î µðÆúÆ® 󸮸¦ Çϵµ·Ï ÇØ ÁÖ¾ú´Ù. Á÷Á¢ ó¸®ÇÏÁö ¾Ê´Â ½Ã½ºÅÛ ¸í·ÉÀº ¹Ýµå½Ã DefWindowProcÀ¸·Î ³Ñ°Ü ÁÖ¾î¾ß ÇÑ´Ù.

Ç÷§Æû

95ÀÌ»ó

ÂüÁ¶

WM_COMMAND


written by http://www.winapi.co.kr