¾È³çÇϼ¼¿ä. ÄÄÇ»ÅÍ°øÇаú 96Çйø ±èÁøÈ«ÀÔ´Ï´Ù. (CAERANG)

 

The AutoFocus

°ø´ë ȨÆäÀÌÁö°¡ »õ·Ó°Ô ´ÜÀåÇÔ¿¡ µû¶ó ¹º°¡ °°ÀÌ »õ·Î¿î ÀÏÀ» ²Ù¸çºÁ¾ß ÇÏ°Ú´Ù´Â »ý°¢¿¡
°­Á¸¦ Çغ¸´Â°ÍÀÌ ¾î¶³±î Çؼ­ ÀÌ·¸°Ô ½ÃµµÇØ º¾´Ï´Ù. Àü°øÀÌ ÀÌÂÊÀÌ´Ùº¸´Ï °­Á·¡ºÁ¾ß ÇÁ
·Î±×·¡¹ÖÀÌ°ÚÁÒ. ¿©·¯ºÐ°ú °°ÀÌ ÀÌ°÷¿¡¼­ Á¤º¸¸¦ °øÀ¯ÇÏ°í ½Í±º¿ä. ¿©·¯ºÐµµ °°ÀÌ È°µ¿Çß
À¸¸é ÁÁ°Ú½À´Ï´Ù.
¿©±â¼­´Â ¿ì¸®µéÀÌ À©µµ¿ìÁîÇÁ·Î±×·¡¹Ö½Ã¿¡ ÈçÈ÷ »ç¿ëÇÏ´Â VC++¸¦ »ç¿ëÇÏ¿© À©µµ¿ìÁîÇÁ·Î
±×·¡¹Ö°ú VC++¿¡¼­ Á¦°øÇÏ´Â MFC¸¦ ÀÌÇØÇÏ°í È°¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. ±×·¯³ª VC++¸¦ 'Åø'ÀÌ
¶ó°í Âø°¢ÇÏ°Ô ÇØÁÖ´Â ±× Æí¸®ÇÑ(?) ±â´ÉµéÀÇ »ç¿ëÀ» °¡´ÉÇÑ Áö¾çÇÒ°ÍÀ̸ç, API¿Í MFC¸¦
È¥¿ëÇÏ´Â ¹æ½ÄÀ» ÅÃÇÒ°ÍÀÔ´Ï´Ù. ÇÏÁö¸¸ ±ÍÂúÀ»¶§´Â WizardµéÀ» »ç¿ëÇϱ⵵ ÇÏ°Ú½À´Ï´Ù. ±×
¸®°í °¡´ÉÇϸé API¿Í MFCÇÁ·Î±×·¡¹Ö¿¡ °æÇèÀÌ ÀÖÀ¸¸ç C++ÀÇ ±âº»Á¤µµ´Â ¾Ë¾Æ¾ß ÇÏ°Ú½À´Ï
´Ù. ±×¸®°í °­Á¸¦ ÁøÇàÇÏ´Â ¹æ½Ä¿¡ À־ 'Ã¥'¿¡¼­ ó·³ ü°èÀûÀ̱⠺¸´Ù´Â Á¦°¡ ±×°ÍµéÀ»
Á¦ÀÛÇÏ´Â °úÁ¤, Áï °³¹ßÇϸ鼭 ¹ß»ýÇß´ø ¹®Á¦Á¡, ¶Ç ±×°ÍÀ» ¾î¶»°Ô ÇØ°áÇß´ÂÁö, ±×¸®°í ¿øÇÏ
´Â ±â´ÉÀ» ¾î¶»°Ô ±¸ÇöÇÒ ¼ö ÀÖ¾ú´ÂÁö¸¦ ±×³É ½Ã°£Àû ¼ø¼­´ë·Î ³ª¿­ÇÒ ¼ÀÀÔ´Ï´Ù. ÇѸ¶µð·Î
¸»ÀÌ ¸¹¾ÆÁú °ÍÀÔ´Ï´Ù.

±× ù¹ø° °­ÁÂ...

- The AutoFocus -

¿©·¯ºÐ, °ø´ë 1Ãþ WorkStation½Ç¿¡¼­ X-TerminalÀ» »ç¿ëÇϽøé (À©µµ¿ì¸Å´ÏÀú¿¡µû¶ó ´Ù¸£
°ÚÁö¸¸) ¸¶¿ì½º°¡ È­¸é»óÀÇ ¿©·¯ À©µµ¿ì¸¦ µ¹¾Æ´Ù´Ò¶§, ÇöÀç ¸¶¿ì½º°¡ À§Ä¡ÇÑ °÷ÀÇ À©µµ¿ì
°¡ ÀÚµ¿ÀûÀ¸·Î ¶°¿À¸£´Â°ÍÀ» º¸½Ç ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª MS-Windows¿¡¼­´Â ÀÚ½ÅÀÌ »ç¿ëÇÏ
°íÀÚ ÇÏ´Â À©µµ¿ì¿¡ ¸¶¿ì½º Ä¿¼­¸¦ °°´Ù ³õ°í 'Ŭ¸¯'À» ÇØ¾ß ºñ·Î¼Ò È­¸éÀÇ ¸Ç ¾ÕÂÊÀ¸·Î ¶°
¿À¸£ÁÒ. ¹°·Ð ÀÌ·¯ÇÑ ±â´ÉÀ» ±¸ÇöÇØ ÁÖ´Â À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÒ ¼ö ÀÖ°ÚÁö¸¸, ¿ì¸®°¡ ÀÌ°ÍÀ» Á÷
Á¢ ¸¸µé¾î º¸´Â°Íµµ Àç¹ÌÀÖÀ»°ÍÀÔ´Ï´Ù.


!@? À¯·¹Ä« ?*%
--------------
»ç½Ç óÀ½ºÎÅÍ ÀÌ°ÍÀ» ¸¸µé·Á°í °èȹÇß´ø°ÍÀº ¾Æ´Ï°í, Waite GroupÀÇ Windows API Bible
(À©µµ¿ìÁî3.1 API Âü°í¼­Àû)À» ÀÚÃë¹æ¿¡¼­ ´©¿ö µÚÀûÀÌ´Ù°¡ ¿ì¿¬È÷ WindowFromPoint¶ó´Â
ÇÔ¼ö¸¦ º¸°Ô µÇ¾ú½À´Ï´Ù. óÀ½¿£ ±×³É Áö³ªÃƴµ¥ °©Àڱ⠸Ӹ®¿¡ 'Æã!'ÇÏ°í ¶°¿À¸£´Â »ý°¢ÀÌ..
"¾î¶ù.. ÁÂÇ¥·Î À©µµ¿ìÇÚµéÀ» ¾ò¾î³¾ ¼ö ÀÖ´Ù¸é, ±× ÇÚµé·Î À©µµ¿ì¸¦ È°¼ºÈ­ ÇÒ ¼ö ÀÖ°Ú´Â
µ¥!!!" ´õ±º¿ä. ±× ´ç½Ã Àü, À©µµ¿ì¸¦ È°¼ºÈ­ ½ÃÅ°´Â API, SetActiveWindow¿Í ±× ÇÔ¼ö°¡ À©
µµ¿ìÀÇ ÇÚµéÀ» ¿ä±¸ÇѴٴ°ÍÀ» ¾Ë°í ÀÖ¾ú±â ¶§¹®¿¡ ±×·± »ý°¢ÀÌ µé°Ô µÈ°ÅÁÒ. µÚ¿¡ ³ª¿À°Ú
Áö¸¸, ½ÇÁ¦·Î ±× ÇÔ¼ö´Â ¿øÇÏ´Â À©µµ¿ì¿¡ ´ëÇØ '²ø¾î´ç±â±â'¸¦ ¼öÇàÇÏÁö ¸øÇÕ´Ï´Ù. ±×·¡¼­ ´Ù
¸¥ ÇÔ¼ö¸¦ »ç¿ëÇϰԵ˴ϴÙ.

Àá±ñ! À§¿¡¼­µµ ¸»¾¸µå·ÈÁö¸¸, Instance°¡ ¹ºÁö ÇÚµéÀÌ ¹ºÁöµîµîÀº ¼³¸í ¾ÈÇص帳´Ï´Ù... À©
µµ¿ìÁîÇÁ·Î±×·¡¹Ö¿¡ °æÇèÀÌ Àִ°ɷΠ°£ÁÖÇÏ°í Àְŵç¿ä.



µðÀÚÀÎÀ» Çغ¼±î!
---------------
¹æ±Ý ¾ð±ÞÇßÁö¸¸, Àü SetActiveWindow API¿Í WindowFromPoint°¡ ÇÊ¿äÇÑ ÀüºÎÀÎÁپ˰í
±ÞÇÑ ¸¶À½¿¡ ¾ó··¶×¶¥ ¹Ù·Î ¼³°è¿¡ µé¾î°¬½À´Ï´Ù. ±× ù¹ø°·Î..

"ÀÌ°Ô ÇؾßÇÒ ÀÏÀº À©µµ¿ìµé°£ÀÇ È­¸éÀüȯ±â´É»ÓÀÏÅ×´Ï È­¸é¿¡ ¹«¾ùÀ» ±×¸± ÇÊ¿ä°¡ ¾ø°Ú°í.
±×·¯´Ï À©µµ¿ì´Â ÇÊ¿ä ¾øÀ»²¨°í, º°·Î ÇÏ´ÂÀϵµ ¾ø´Âµ¥ AppWizard°¡ »ý¼ºÇØÁÖ´Â ¹«Áö¸·Áö
(?)ÇÑ ±âº»ÄÚµåµéµµ ÇÊ¿ä¾ø°Ú´Ù. ±×·±µ¥ API·Î¸¸ ÀÛ¼ºÇÏ´Â°Ç ¸Å¿ì ±ÍÂúÀ¸´Ï±î MFC class¸î
°³¸¸ ¾ò¾î¾²ÀÚ.." ÀÌ·±»ý°¢À» Çß½À´Ï´Ù. ±×·±µ¥ Á¶±ÝÀÌ¶óµµ ±ÍÂúÀº°Ô ½ÈÀº Àü, ÇÁ·ÎÁ§Æ® ±¸
¼ºÇÏ´Â°Ô ±ÍÂú¾Æ¼­ ¹Ì´Ï¸ÖÄڵ带 »ý¼ºÇϱâ À§ÇØ AppWizard·Î Dialog based¸¦ ¼±ÅÃÇÏ°í ±â
º»ÀûÀ¸·Î ¼±ÅÃµÈ Ã¼Å©¹Ú½ºµéÀ» ¸ðµÎ uncheckÇÏ°í Finish¸¦ ´­·¶½À´Ï´Ù. (ÇÁ·ÎÁ§Æ® À̸§Àº
AutoFocus) »ý¼ºµÈ ±× ÃʶóÇÑ ±âº»Äڵ忡¼­ Dialog¿¡ °ü·ÃµÈ ¸ðµçÄÚµå, Dialog»ý¼ºÇØ ºÎ¸£
´Â ºÎºÐ°ú ±× DialogÄڵ带 °®°í ÀÖ´Â AutoFocusDlg.*¸¦ Áö¿ü½À´Ï´Ù. ÀÌ·¸°Ô Çؼ­ À©µµ¿ìµµ
¾ø´Â ´Þ¶û CWinApp¸¦ »ó¼ÓÇÑ theApp¶ó´Â ÀνºÅϽº¸¸ ³²Àº ¹Ì´Ï¸Ö Äڵ带 ¿Ï¼ºÇß½À´Ï´Ù.

< ±× ¹Ì´Ï¸Ö ÄÚµå *.CPP¸¸ >
#include "stdafx.h"
#include "AutoFocus.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CAutoFocusApp

BEGIN_MESSAGE_MAP(CAutoFocusApp, CWinApp)
//{{AFX_MSG_MAP(CAutoFocusApp)
//}}AFX_MSG_MAP
// Standard file based document commands
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAutoFocusApp construction

CAutoFocusApp::CAutoFocusApp()
{
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CAutoFocusApp object

CAutoFocusApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CAutoFocusApp initialization

BOOL CAutoFocusApp::InitInstance()
{
// ´Ù Áö¿ü½¿... ±ú²ýÇϱº..
return TRUE;
}

¾Æ½Ã´Ù½ÃÇÇ, CWinApp´Â applicationÀ» ÁغñÇÏ°í ½ÇÇàÇØÁÖ´Â ÀÏÀ» ´ã´çÇϴ Ŭ·¡½ºÁÒ. ¿ì¸®
´Â ±× Ŭ·¡½ºÀÇ ¸î°¡Áö ±â´ÉµéÀ» ÀÌ¿ëÇϱâ À§ÇØ ±× Ŭ·¡½º¸¦ »ó¼Ó¹Þ¾Ò½À´Ï´Ù. (»ó¼ÓÀ» ¹Þ¾Æ
¾ß overload¸¦ ÇÒ ¼ö ÀÖÀ¸´Ï±î..) »ó¼Ó¹ÞÀº Ŭ·¡½ºÀÇ À̸§Àº CAutoFocusAppÀÌ°í ÀÌ°ÍÀº ÇÁ
·Î±×·¥¿¡¼­ ´Ü Çϳª»ÓÀÌ°í Çϳª»ÓÀ̾î¾ß ÇÏ´Â theApp¶ó´Â ÀνºÅϽº·Î »ý¼ºµÇ¾ú½À´Ï´Ù. ¿ì¸®
´Â ÇÁ·Î±×·¥ÀÇ ÃʱâÈ­¸¦ À§ÇØ CWinApp::InitInstance() ¸â¹öÇÔ¼ö¸¦ ¿À¹ö·ÎµåÇؼ­ ¿ì¸®µéÀÌ
ÇÊ¿äÇÑ ÃʱâÈ­ÀÛ¾÷À» ±×°÷¿¡ ³Ö°Ô µË´Ï´Ù.
±×·³ ÀÌÁ¦ ¹«¾ùÀ» ÇØ¾ß ÇÏ´À³Ä.. È­¸é¿¡ À©µµ¿ì´Â ÇÊ¿ä¾øÀ¸´Ï±î (¶Ç ±×°Å È­¸é¿¡ ¶ß¸é È­¸é
¹Ø¿¡ ŽºÅ©¹Ù¿¡µµ Á¶±×¸¸ â Çϳª ¶ß´Ï±î º¸±âµµ ¾ÊÁÁÀ»Å×´Ï) À©µµ¿ì´Â »ý¼ºÇÏÁö ¸»°í À©
µµ¿ìÁî¿¡ À©µµ¿ìŬ·¡½º(WNDCLASS)µî·Ï¸¸ ÇÏÀÚ... ¶ó´Â ¸»µµ ¾ÈµÇ´Â »ý°¢À» Çعö·È½À´Ï´Ù.
¹Ùº¸°°ÀÌ, È­¸é¿¡ Ç¥½ÃÇÒ°Í ¾ø´Ù°í À©µµ¿ìµµ »ý¼ºÇÏÁö ¾ÊÀ»·Á°í Ç߳׿ä.. ±×·±µ¥ ÀÀ¿ëÇÁ·Î±×
·¥Àº À©µµ¿ì¸Þ¼¼Áö ó¸®ÇØ¾ß ÇÒ ÀÏÀÌ ¹Ýµå½Ã ÀÖÀ¸¹Ç·Î WindowProc¶ó´Â Window Message
ó¸® ÇÁ·Î½ÃÁ®°¡ ÇÊ¿äÇÏ°í, ¶Ç ±×°Í¿¡´Â Ç×»ó ¹ß»ý ¸Þ¼¼Áö¸¦ Àü´ÞÇØÁØ À©µµ¿ìÀÇ ÇÚµéÀÌ Àü
´ÞµÇ¹Ç·Î ¹Ýµå½Ã ÇϳªÀÇ À©µµ¿ì´Â »ý¼ºµÇ¾ß ÇÕ´Ï´Ù. (¸¸ÀÏ À©µµ¿ì ¸Þ¼¼Áö¸¦ ó¸®ÇÒ Àϵµ
¾ø°í È­¸é¿¡ Ç¥½ÃÇҰ͵µ ¾ø´Ù¸é À©µµ¿ì »ý¼º ¾ÈÇصµ µÇÁö..., ¹¹ ±×·±Àϵµ ÃæºÐÈ÷ ÀÖÀ» ¼ö ÀÖ
¾î, ±Ùµ¥ ±×·³ ±×°Ô ¹¹¾ß???)


ÃÖ¼ÒÇÑÀÇ Ã¢À» ¸¸µéÀÚ!
-------------------
BOOL CAutoFocusApp::InitInstance()
{
CString strWndClass = AfxRegisterWndClass(0,
LoadCursor(IDC_ARROW), 0);

CMyWnd* pWnd = new CMyWnd;
pWnd->Create(strWndClass, NULL, 0, CRect(), NULL, NULL);

m_pMainWnd = pWnd;

return TRUE;
}

À§¿Í°°ÀÌ Frameµµ, Documentµµ, Viewµµ ¾ø´Â ÃÖ¼ÒÇÑÀÇ À©µµ¿ì¸¦ ¸¸µé¾îºÃ½À´Ï´Ù. À©µµ¿ì
¸¸µé±âÀü¿¡ À©µµ¿ìŬ·¡½º(WNDCLASS)¸¦ µî·ÏÇØ¾ß ÇϹǷΠWNDCLASS¸¦ Á¤ÀÇÇÏ°í
RegisterClass API¸¦ »ç¿ëÇÏ·Á Çߴµ¥, »ç¿ëµµ ºÒÆíÇÏ°í WndProc³ª hInstance¸¦ Á¤ÀÇÇϱâ
°¡ ±î´Ù·Î¿ö OnLineµµ¿ò¸»À» µÚÁö´Ï AfxRegisterWndClass¶ó´Â °£ÆíÇÑ MFC ¸â¹öÇÔ¼ö¸¦
¹ß°ßÇß½À´Ï´Ù. (OnLineµµ¿ò¸»Àº Á¤¸» Á¤º¸ÀÇ ÀºÇàÀÔ´Ï´Ù. À߸¸ µÚÁö¸é º° Á¤º¸¸¦ ´Ù ¾òÀ»
¼ö ÀÖÁÒ.) AfxRegisterWndClass´Â WndProc¿Í hInstance¸¦ ±âº»Á¤ÀÇÇÏ°íÀÖ¾î Ưº°È÷ µû·Î
Á¤ÀÇÇÒ ÇÊ¿ä ¾ø°í, Ŭ·¡½º À̸§µµ ÀÚµ¿À¸·Î »ý¼ºÇØÁÖ´Â Æí¸®ÇÑ ÇÔ¼öÁÒ. ±×°ÍÀ¸·Î
WNDCLASS¸¦ Á¤ÀÇ, µî·ÏÇÏ°í ¹Ù¶ó´ø À©µµ¿ì¸¦ À§¿Í°°ÀÌ »ý¼ºÇß½À´Ï´Ù. À©µµ¿ì¸¦ »ý¼ºÇÏ´Â
Create¸â¹öÇÔ¼öÀÇ Ã¹¹ø° ÆĶó¸ÞÅÍÀΠŬ·¡½º À̸§À» Á¦¿ÜÇÏ°í ³ª¸ÓÁö´Â ´Ù NULL°ú 0 µîÀÎ
µ¥, Àú·¸°Ô Çϸé È­¸é¿¡ ³ªÅ¸³ªÁö ¾Ê´Â À©µµ¿ì¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. (ÇÔ¼öÀÇ »ç¿ë¹ýÀº Âü
°í¼­ÀûÀ̳ª µµ¿ò¸»À» º¸¼¼¿ä.) ±× ¹Ø¿¡ m_pMainWnd´Â CWinThreadÀÇ ¸â¹öÇÔ¼ö¸ç, À©µµ¿ì
ÀÇ Æ÷ÀÎÅ͸¦ À¯ÁöÇØ¾ß ÇϹǷΠÀ§¿Í°°ÀÌ »ý¼ºµÈ À©µµ¿ìÀÇ Æ÷ÀÎÅ͸¦ ´ëÀÔÇØÁÝ´Ï´Ù.
(CWinApp´Â CWinThread¿¡¼­ ÆÄ»ýµÊ) ¿ø·¡´Â ¹Ì´Ï¸ÖÄڵ带 ¸¸µé¶§ »ý¼ºµÈ Dialog¸¦ °¡¸®
Å°°í ÀÖ¾ú½À´Ï´Ù.


¾Æ´Ï ¿ì° ÀÌ·±ÀÏÀÌ?!@#
--------------------
Build¸¦ ´­·¯ ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏ, ¸µÅ©ÇØ º¸¾Ò½À´Ï´Ù. Àß µÇ´õ±º¿ä. ±×·¡¼­ ½ÇÇàÇØ º¸¾Ò½À´Ï
´Ù. ±×·±µ¥, ÀÌ°Ô ¿ØÀÏ? RunTime¿¡·¯°¡ ³ª´Â±º¿ä.. µµ´ëü ÀÌÇØ°¡ ¾ÈµÆ½À´Ï´Ù. ¹Ùº¸°¡ µÇ´Â
´À³¦À̾ú½À´Ï´Ù. Àú·± ÃÖ¼ÒÇÑÀÇ Äڵ尡 ¿¡·¯¸¦ ³»´Ù´Ï... TC·Î 5ÁÙÂ¥¸® ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ
°í ½ÇÇàÇߴµ¥ 5°³ÀÇ ¿¡·¯°¡¶° ÀúÇÑÅ× ³î¸²À» ´çÇÏ´ø ºÒ½ÖÇÑ Á¦ Ä£±¸°¡ ´«¿¡ ¾Æ¸¥°Å·È½À´Ï
´Ù. ±º´ë°¬±â¿¡ ¸ÁÁ¤ÀÌÁö.. ¾î¶µç, Á¤½ÅÀ» Â÷¸®°í Debug¿£ ÀÚ½ÅÀÌ ÀÖ¾ú´ø Àü ÀǽÉÀÌ µÇ´Â
CreateÇÔ¼ö ¹Ù·ÎÀü±îÁö ½ÇÇàÇÏ°í ¸ØÃß¾î ÇѴܰ辿 ½ÇÇàÀ» ÁøÇàÇß½À´Ï´Ù. ±×·±µ¥ ¹®Á¦´Â
MFC! Create ¸â¹öÇÔ¼ö ³»ºÎ ÁøÀÔ´Ü°è¿¡¼­ ASSERT·Î pParentÀ©µµ¿ì Æ÷ÀÎÅÍ °ªÀ» NULL
ÀÎÁö ºñ±³ÇØ NULLÀÌ´Ï±î ¿¡·¯¸¦ ³»´õ±º¿ä. À§ Äڵ忡¼­ CreateÀÇ 5¹ø° ÆĶó¸ÞÅÍ´Â parent
windowÀÇ Æ÷ÀÎÅ͸¦ ³Ö°Ô µÇ¾îÀÖÁö¸¸, ´ç¿¬È÷ ù¹ø° »ý¼ºµÇ´Â À©µµ¿ì¶ó¼­ ºÎ¸ðÀ©µµ¿ì´Â ¾ø
À¸´Ï NULL·Î Çϴ°ÍÀÌ ´ç¿¬ÇÕ´Ï´Ù. ÀÌ°ÍÀ» ¿¡·¯¶ó´Ï ÇÒ¸»ÀÌ ¾ø´õ±º¿ä. ÀÌÀ¯´Â »ý°¢º¸´Ù ½±
°Ô ¹ß°ßÇßÁö¸¸, ´çȲÇß½À´Ï´Ù. "±×·³ ¾î¶»ÇÏÁö?" ±×·±µ¥ ¸¶À½ÀÌ °¡¶ó¾ÉÀ¸´Ï ±×°÷¿¡ ¾Æ·¡¿Í
°°Àº ÄÚ¸àÆ®°¡ Çϳª Àû¾îÁ® ÀÖ´Â°Ô º¸ÀÌ´õ±º¿ä.
// can't use for desktop or pop-up windows (use CreateEx instead)
¹«½¼ ÀǹÌÀÎÁö´Â ÀÌÇØ°¡ Àß ¾ÈµÅ¾úÁö¸¸ °ýÈ£¾ÈÀÇ CreateEx¸¦ ´ë½Å »ç¿ëÇ϶ó´Â ¸»¿¡ ´«±æÀÌ
°¬½À´Ï´Ù. ¾î¶´ø ÇöÀç ÀÌ Create(Wincore.cpp¿¡ Á¤ÀǵÊ)´Â ºÎ¸ðÀ©µµ¿ì¸¦ ¿ä±¸ÇÏ°í ÀÖ°í, ±×
·¸´Ù°í MFC¼Ò½º¸¦ ¼öÁ¤ÇÒ ¼ö ´Â ¾øÀ¸´Ï, CreateEx¸¦ »ìÆ캸´Â°Ô ³µ°Ú´Ù´Â »ý°¢À» Çß½À´Ï
´Ù. CreateEx´Â 1°³ÀÇ ÆĶó¸ÞŸ°¡ Ãß°¡µÈ°ÍÀÔ´Ï´Ù. À©µµ¿ìÈ®À彺ŸÀÏÀÌÁÒ. ±×·±µ¥ Áß¿äÇÑ°Í
Àº ÀÌ ¸â¹öÇÔ¼ö´Â parent windowÀÇ Æ÷ÀÎÅ͸¦ °Ë»çÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ̾ú½À´Ï´Ù. ±â»»½À´Ï´Ù.
¾î¶µç ÇØ°áÀÌ µÇ¾úÀ¸´Ï±î¿ä. ±×·¡¼­ ¼öÁ¤ÇÏ¿´½À´Ï´Ù.

<¼öÁ¤µÈ ÄÚµå>
BOOL CAutoFocusApp::InitInstance()
{
CString strWndClass = AfxRegisterWndClass(0,
LoadCursor(IDC_ARROW), 0);

CMyWnd* pWnd = new CMyWnd;
// ù¹øÀç 0ÀÌ À©µµ¿ìÈ®À彺ŸÀÏ. ÇÊ¿ä¾øÀ¸´Ï 0
pWnd->CreateEx(0, strWndClass, NULL, 0, CRect(), NULL, NULL);

m_pMainWnd = pWnd;
return TRUE;
}

½ÇÇ࿪½Ã Àß µÇ¾ú½À´Ï´Ù. ´Ü È­¸é¿¡ º¸À̴°ÍÀÌ ¾øÀ¸¹Ç·Î(ŽºÅ©¹Ù¿¡µµ ³ªÅ¸³ªÁö ¾ÊÀ¸¹Ç·Î)
ÇÁ·Î¼¼½º¸Þ´ÏÀú¸¦ ¶ç¿ö ÇÁ·Î¼¼½º¸¦ Á÷Á¢ È®ÀÎÇØ¾ß ÇÕ´Ï´Ù. À©µµ¿ìÁîNT´Â Ctrl+Shift+EscÅ°¸¦
´©¸£¸é À©µµ¿ì¸Þ´ÏÀú°¡ ¶ßÁÒ. Windows9X¿¡¼­´Â CTRL+ALT+DELÀ» ´©¸£¸é ÇÁ·Î¼¼½º È®ÀÎ
Àº °¡´ÉÇÒ °Ì´Ï´Ù.
À§¿¡¼­ ±× º¸ÀÌÁö ¾Ê´Â À©µµ¿ì¸¦ »ý¼ºÇϱâÀ§ÇØ CWnd¸¦ CMyWnd·Î »ó¼Ó¹Þ¾Ò½À´Ï´Ù. »ç½Ç
À©µµ¿ì¸¸ »ý¼ºÇÏ°í ´õ ÀÌ»ó ÇÒÀÏÀÌ ¾ø´Ù¸é ¹Ù·Î CWndŬ·¡½º¸¦ ÀÌ¿ëÇØ À©µµ¿ì¸¦ »ý¼ºÇصµ
µÇ°ÚÁö¸¸, CWnd¿¡¼­ º¸³»¿Ã À©µµ¿ì¸Þ¼¼ÁöµéÀ» ó¸®ÇØ¾ß ÇϹǷΠ±×°ÍÀ» »ó¼Ó¹Þ¾Æ¾ß ÇÕ´Ï´Ù.
¾Æ±îµµ ¸»ÇßÁö¸¸, ±×·¡¾ß overload¸¦ ÇÒ ¼ö ÀÖÀ¸´Ï±î¿ä.

ŸÀ̸Ӹ¦ ´ÞÀÚ, ±×·±µ¥ ¸Þ¼¼Áö´Â?
---------------------------
¸Þ¸ð¸®¿¡ ¶° ÀÖ´Â ±× ÇÁ·Î¼¼½º¸¦ Á×ÀÌ°í³ª¼­ ´ÙÀ½ ÇÒÀÏÀ» ã¾Ò½À´Ï´Ù.
WindowFromPoint¿¡¼­ ¿ä±¸Çϴ°ÍÀº ¸¶¿ì½ºÄ¿¼­ÀÇ È­¸éÁÂÇ¥ÀÔ´Ï´Ù. È­¸éÁÂÇ¥°¡ º¯ÇÒ¶§¸¶´Ù
¸¶¿ì½ºÄ¿¼­ÀÇÀ§Ä¡¸¦ ±¸ÇØ WindowFromPoint¿¡ Àü´ÞÇؾß, ¿ì¸®°¡ ±Ã±ØÀûÀ¸·Î °¥±¸ÇÏ´Â '²ø¾î
´ç±â±â'¸¦ ¼öÇàÇÒ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ»Å״ϱñ ¸»ÀÌÁÒ. ±×·¡¼­ ¸¶¿ì½ºÀÇ ¿òÁ÷ÀÓ¿¡ ¹ÝÀÀÇÏ´Â
WM_MOUSEMOVE¸¦ »ç¿ëÇϱâ·Î Çß½À´Ï´Ù. ±×·±µ¥ ¸Þ¼¼Áö´Â ¾î¶»°Ô Àü´ÞÇÏÁö? MFCÇÁ
·Î±×·¡¹ÖÀ» Çغ¸¼Ì´Ù¸é *.h¿¡¼­ÀÇ DECLARE_MESSAGE_MAP°ú *.cpp¿¡¼­ÀÇ
BEGIN_MESSAGE_MAP±×¸®°í END_MESSAGE_MAPÀ» ÀÚÁÖ º¸¾ÒÀ»°Ì´Ï´Ù.
ClassWizard¸¦ ºÒ·¯º¸½Ã¸é ÇÏ´Ü¿¡ °¢ Ŭ·¡½ºÀÇ ¸â¹öÇÔ¼öµéÀÌ ³ª¿­µÇÀÖ°í ±× ¾Õ¿¡´Â VȤÀº
W¶ó´Â Ç¥½Ã°¡ µÇ¾îÀÖ½À´Ï´Ù. V´Â virtualÀ» ÀǹÌÇÏ°í W´Â Window Message¸¦ ÀǹÌÇÏÁÒ.
¿©·¯ºÐÀº ÀÌ·±»ý°¢ Çغ¸¼Ì½À´Ï±î? ¿Ö °¡´ÉÇÑ À©µµ¿ì¸Þ¼¼Áö¸¦ ¸ðµÎ virtual ÇÔ¼ö·Î ¸¸µéÁö ¾Ê
¾ÒÀ»±î? ¶ó´Â »ý°¢. C++¿¡ ´ëÇØ ÀÚ¼¼È÷ ³ª¿ÍÀÖ´Â ÀڷḦ º¸½Ã¸é vtableÀ̶ó´Â ´Ü¾î°¡ ³ª¿É
´Ï´Ù. vtableÀº polymorphysmÀ» ±¸ÇöÇØÁÖ´Â virtualÀ» ±¸ÇöÇÒ¶§ ÇÊ¿äÇÑ ÁÖ¼ÒÅ×À̺íÀÔ´Ï´Ù.
virtualÀ̶ó°í ¼±¾ðµÈ ¸ðµç ÇÔ¼ö´Â vtable¾È¿¡ ±× ÇÔ¼öÀÇ ½ÃÀÛÁÖ¼Ò°¡ ÀúÀåµÇ°Ô µË´Ï´Ù. ¹°·Ð
virtualÇÔ¼ö°¡ ¾ø´Ù¸é vtableµµ ¾ø½À´Ï´Ù. ±×·±µ¥ ±× virtualÇÔ¼ö°¡ Àִ Ŭ·¡½º¸¦ »ó¼ÓÀ» ¹Þ
À¸¸é »ó¼Ó¹ÞÀº Ŭ·¡½º¿¡´Â virtualÇÔ¼ö°¡ ¾ø´õ¶óµµ »óÀ§Å¬·¡½ºÀÇ virtual ÇÔ¼öÀÇ ½ÃÀÛÁÖ¼Ò¸¦
ÀúÀåÇÒ vtableÀÌ ¸¸µé¾î Áø´Ù´Â °ÍÀÔ´Ï´Ù. virtualÇÔ¼öÀÇ ½ÃÀÛÁÖ¼Ò´Â 4¹ÙÀÌÆ®ÀÔ´Ï´Ù. vtableÀº
»ó¼Ó¹Þ´Â Ŭ·¡½º¿¡µµ ±×´ë·Î Àü´ÞµË´Ï´Ù. »ó»óÇغ¸¼¼¿ä. ¼ö¸¹Àº À©µµ¿ì¸Þ¼¼ÁöµéÀÌ virtual·Î
¼±¾ðµÇ¸é ¾öû³­ vtable¿ë ¸Þ¸ð¸®°¡ ¼Ò¿äµÉ°ÍÀÌ°í, ¶ÇÇÑ ±×°ÍÀ» °®°í Àִ Ŭ·¡½º¸¦ »ó¼Ó¹Þ
À¸¸é ±× vtableµµ »ó¼ÓµÇ¹Ç·Î vtable¿ëÀ¸·Î ÇÒ´çµÇ´Â ¸Þ¸ð¸®´Â ²ûÁ÷Çϵµ·Ï ±âÇϱ޼öÀûÀ¸·Î
´Ã¾î³¯ °ÍÀÔ´Ï´Ù. ¶ÇÇÑ virtual¿¡ ÀÇÇÑ ºÎÀûÀýÇÑ polymorphysmÈ¿°úµµ ¹ß»ýÇÑ´Ù´Â ±º¿ä. ±×
·¡¼­ MFC GroupÀº ÇÊ¿äÇÑ ¸î°³ÀÇ À©µµ¿ì¸Þ¼¼Áö¿Í ÇÔ¼öµé¿¡ ´ëÇؼ­¸¸ virtualÀ» »ç¿ëÇÏ°í
³ª¸ÓÁö ¸Þ¼¼Áöµé¿¡ ´ëÇؼ­´Â Message Mapping±â¹ýÀ» »ç¿ëÇÏ¿© È¿°úÀûÀÎ ÇÁ·Î±×·¡¹ÖÀÌ °¡
´ÉÇϵµ·Ï ÇÏ¿´½À´Ï´Ù. Ȥ½Ã³ª ¼Óµµ°¡ ´À·ÁÁöÁö ¾ÊÀ»±î °ÆÁ¤ÇϽÇÁö ¸ð¸£°ÚÁö¸¸, Çؽ¬Å×À̺íÀ»
»ç¿ëÇØ Message CachingÀ» ÇÏ¿© ¼Óµµ»óÀÇ ÀúÇÏ´Â °ÅÀÇ ¾ø´ä´Ï´Ù.
±× Message MappingÀ» ±¸ÇöÇØÁÖ´Â ¸ÅÅ©·Î°¡ DECLARE/BEGIN/END_MESSAGE_MAPÀÔ
´Ï´Ù. ±âº»ÀûÀ¸·Î CWinApp¿¡¼­ ¸Þ¼¼ÁöÅ¥¿¡¼­ ¸Þ¼¼Áö¸¦ ¹Þ¾Æ DispatchÇÏÁö¸¸, ±× ¸Þ¼¼Áö¸¦
¹Þ´Â°ÍÀº CWndÀÔ´Ï´Ù. ¿ì¸®´Â ±×°ÍÀ» CMyWnd·Î »ó¼Ó ¹Þ¾ÒÀ¸´Ï ÇÊ¿äÇÑ ¸Þ¼¼Áö󸮸¦ ÇÒ
¼ö ÀְԵǾú½À´Ï´Ù. (CWinApp¿Í CWnd´Â ¸ðµÎ CCmdTarget¿¡¼­ ÆÄ»ýµÈ Ŭ·¡½ºÀÔ´Ï´Ù.
CCmdTargetŬ·¡½º´Â ¸Þ¼¼Áö¸Ê ±âº» Ŭ·¡½º·Î½á ÀÌ°ÍÀ» »ó¼Ó¹ÞÀ¸¸é ¸ÅÇÎµÈ ¸Þ¼¼Áö 󸮰¡
°¡´ÉÇÏ°Ô µË´Ï´Ù.)
À̾߱Ⱑ ±æ¾îÁ³´Âµ¥, Àú´Â WM_MOUSEMOVE¸¦ ÀÌ¿ëÇØ ¸¶¿ì½º°¡ ¿òÁ÷À϶§¸¶´Ù ¸¶¿ì½ºÄ¿
¼­ÀÇ ÁÂÇ¥°Ë»ç¸¦ÇØ ÇÊ¿äÇÑ ÀÏÀ» ¼öÇàÇÏ·Á Çß½À´Ï´Ù. ±×·±µ¥ ¾ÑÂ÷! »ý°¢Çغ¸´Ï
WM_MOUSEMOVE¸Þ¼¼Áö´Â À©µµ¿ì°¡ È°¼ºÈ­ »óÅÂÀ϶§¸¸ ¹ß»ýµÇ´Âµ¥, ¿©±â¼­ÀÇ À©µµ¿ì´Â
È­¸é¿¡ º¸ÀÌÁö ¾ÊÀ¸´Ï ºñ È°¼ºÈ­ »óÅÂÀÌ°í, ´Ù¸¥ À©µµ¿ìµéÀ» °è¼ÓÇؼ­ Àüȯ½ÃÅ°·Á¸é ºñÈ°¼º
È­ »óÅ¿¡¼­µµ °è¼Ó ÀÛ¾÷À» ÁøÇàÇØ¾ß Çϴµ¥, ¿ÏÀüÈ÷ µô·¹¸¶¿¡ ºüÁ®¹ö·È½À´Ï´Ù. ±×¶§
WM_TIMER°¡ »ý°¢³µ½À´Ï´Ù. WM_TIMER´Â È°¼ºÈ­´ø ºñÈ°¼ºÈ­´ø °ü°è¾øÀÌ ÁÖ±âÀûÀ¸·Î
¹ß»ýµÇ´Â ¸Þ¼¼Áö À̹ǷΠÇØ°áÀÌ µÈ°ÍÀÔ´Ï´Ù. ±×·¡¼­ WM_TIMER¸¦ ÀåÂøÇß½À´Ï´Ù. ±×·±µ¥
±× ¸Þ¼¼Áö¸¦ ó¸®ÇÒ CMyWndŬ·¡½º´Â ¼Õ¼ö ¸¸µç°ÍÀ̹ǷΠ¸Þ¼¼Áö¸ÊÀÌ Çü¼ºµÇÀÖÁö ¾Ê½À´Ï
´Ù. ±×°ÍÀ» ¸¸µé¾î ÁÖ¾î¾ß ÇÕ´Ï´Ù. ¿ì¼± AutoFocus.hÆÄÀÏ¿¡ Àû¾îÁ® ÀÖ´Â CMyWndŬ·¡½ºÀÇ
¸Ç ¹Ø¿¡ DECLARE_MESSAGE_MAP()À̶ó°í Àû¾îÁÝ´Ï´Ù. (ÀÌ ¸ÅÅ©·Î°¡ ¾î¶»°Ô ±¸¼ºµÇ¾î
ÀÖ´ÂÁö ¾Æ½Ã°í ½ÍÀ¸½Ã¸é mfc¼Ò½º¸¦ µÚÁ®º¸¼¼¿ä.) ±×¸®°í AutoFocus.cpp¿¡´Â ¾Æ·¡¿Í °°ÀÌ
Ãß°¡ÇØÁÝ´Ï´Ù. (BEGIN/END_MESSAGE_MAP() ºÎºÐÀ» º¸¼¼¿ä) ±×¸®°í
BEGIN_MESSAGE_MAP°ú END_MESSAGE_MAP»çÀÌ¿¡ ¿ì¸®°¡ ¿øÇÏ´Â ¸Þ¼¼Áö¸¦ ¼±¾ðÇÕ
´Ï´Ù. ¿©±â¼­ MFC°¡ ±âº»ÀûÀ¸·Î WM_TIMER¿¡ ´ëÇÑ Çڵ鷯¸¦ Á¤ÀÇÇØ ³õÀº°Ô ÀÖÀ¸¹Ç·Î ±×
°ÍÀ» »ç¿ëÇÕ´Ï´Ù. ±× »çÀÌ¿¡ ON_WM_TIMER()¸¦ Àû¾î ³Ö½À´Ï´Ù. ±×·¯¸é ±âº» Çڵ鷯ÀÎ
OnTimer(UINT)°¡ ºÒ¸± °ÍÀÔ´Ï´Ù. OnTimer´Â ´ç¿¬È÷ CMyWnd¿¡ ³Ö¾î¾ß °ÚÁÒ? ¾Æ·¡¸¦ º¸
¼¼¿ä. OnTimer¿¡ Àü´ÞµÇ´Â Timer ID´Â ÇÊ¿ä ¾ø½À´Ï´Ù. ¾îÂ¥ÇÇ ÇϳªÀÇ Å¸À̸Ӹ¸ »ç¿ëÇÒÅ×´Ï
±î¿ä. ±× ¾Ê¿¡ AutoFocusÀÇ ÇÙ½É ±â´ÉÀ» ¼öÇàÇÒ ÇÔ¼ö¸¦ ³Ö¾ú½À´Ï´Ù.

<ÄÚµå..>

BOOL CAutoFocusApp::InitInstance()
{
CString strWndClass = AfxRegisterWndClass(0,
LoadCursor(IDC_ARROW), 0);

CMyWnd* pWnd = new CMyWnd;
pWnd->CreateEx(0, strWndClass, NULL, 0, CRect(), NULL, NULL);

m_pMainWnd = pWnd;

// ŸÀÌ¸Ó ID: 1000, ½Ã°£°£°Ý 700ms
m_pMainWnd->SetTimer(1000, 700, NULL);

return TRUE;
}


BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
ON_WM_TIMER()
END_MESSAGE_MAP()


CMyWnd::CMyWnd()
{
}

void CMyWnd::OnTimer(UINT nID)
{
OnAutoFocus();
}

Äڵ忡 ´ëÇÑ ¼³¸íÀÌ ´Ù¼Ò ºÎÁ·ÇÑ ´À³¦ÀÌ µì´Ï´Ù. ÇÏÁö¸¸ ¿©±â¼­´Â °úÁ¤À» ´õ Áß¿äÇÏ°Ô »ý°¢
ÇÏ°í ÀÖÀ¸¹Ç·Î ¿©·¯ºÐÀÌ À§ Äڵ忡 ´ëÇÑ °ËÁõ°ú µµ¿ò¸»ÀÇ È°¿ëÀ» ²ÙÁØÈ÷ ÇÏ¼Å¾ß ÇÒ°ÍÀÔ´Ï
´Ù. »ç½Ç À§ÀÇ ±â´ÉÀ» ÇÏ´Â ÄÚµå´Â ¼ø¼ö API·Î¸¸ ÀÛ¼ºÇصµ ¾ó¸¶ ±æÁö ¾Ê°í º¸±â¿¡µµ ´Ü¼øÇÕ
´Ï´Ù. ÀÌ·¸°Ô MFC¸¦ È¥¿ëÇϴ°ÍÀÌ ´õ¿í º¹ÀâÇÏ°í ¾î·ÆÁÒ. ÇÏÁö¸¸ ´õ¿í ´Ù¾çÇÑ ±â´ÉÀ» °¡Áø
ÇÁ·Î±×·¥À» Á¦ÀÛÇÏ´Ùº¸¸é MFC°¡ ¼ö¸¹Àº ¿À¹öÇìµå¸¦ Á¦°ÅÇØÁÖ¸ç ´Ù¾çÇÏ°í Æí¸®ÇÑ ±â´ÉÀ»
Á¦°øÇØ Áشٴ°Ϳ¡ °¨»çÇÏ°Ô µÉ°ÍÀÔ´Ï´Ù. ³ªÁß¿¡ ÀÌ °­Á°¡ ³¡³ª°í ³ª¸é ¼ø¼ö API ¹öÀüÀ¸
·Î µû·Î ¿Ã·Áµå¸®ÁÒ.

 

¸¶Áö¸· Áغñ!
-----------
°ÅÀÇ Áغñ°¡ ³¡³µ½À´Ï´Ù. »¡¸® º»·ÐÀ¸·Î µé¾î°¡Áö ¾Ê´Â´Ù°í ÅõÁ¤ÇÏÁö ¸¶¼¼¿ä. º»·ÐÀº °£´Ü
Çϴϱî¿ä. ¸¶Áö¸· Áغñ´Â ÀÌ ÇÁ·Î±×·¥ÀÌ ½ÇÇàÇÒ¶§¸¶´Ù °è¼Ó ¸Þ¸ð¸®¿¡ ¶ßÁö ¾Ê°Ô Çϴ°ÍÀÔ
´Ï´Ù. AutoFocusÀÇ ±â´ÉÀ» ÇÏ´Â ÇÁ·Î±×·¥Àº ´Ü Çѹø¸¸ ¸Þ¸ð¸®¿¡ ·Îµå µÇ¸é µÇ°ÚÁÒ.
À©µµ¿ìÁî 3.1±îÁö´Â ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵ɶ§ WinMainÇÔ¼ö¿¡ Previous Instance¸¦ Àü´ÞÇØ ÁÝ´Ï
´Ù. Previous Instance´Â ÀÚ½ÅÀÇ ¹Ù·Î Àü ÀνºÅϽº¸¦ ¸»Çϴ°ÍÀ¸·Î, a.exe¶ó´Â ÇÁ·Î±×·¥À» µÎ
¹ø ¶ç¿î´Ù°í °¡Á¤Çϸé, óÀ½À¸·Î a.exe°¡ ½ÃÀ۵ɶ§ Previous Instance¿¡´Â 0À», µÎ¹ø° ½ÇÇà
µÉ¶§´Â óÀ½À¸·Î ½ÇÇàµÈ a.exeÀÇ Instance¸¦ Previous Instance·Î Àü´ÞÇØ ÁÝ´Ï´Ù. ÀÌ°ÍÀ» ÀÌ
¿ëÇØ ÀÚ½ÅÀÌ ÀÌ¹Ì ½ÇÇàÀÌ µÇ¾î ÀÖ´ÂÁö ÆÇ´ÜÀ» ÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ±×·¯³ª Win32·Î ³Ñ¾î¿À¸é
¼­ Previous InstanceÀÇ Àǹ̴ »ç¶óÁ® Ç×»ó 0°ªÀ» °®°í ÀÖÀ¸¹Ç·Î ´õ ÀÌ»ó ±×°ÍÀ» »ç¿ëÇÒ
¼ö ¾ø½À´Ï´Ù. ±×·¯³ª ´ÙÇàÈ÷ FindWindow¶ó´Â API¸¦ ÀÌ¿ëÇØ °°Àº ±â´ÉÀ» ¼öÇàÇÒ ¼ö ÀÖ½À
´Ï´Ù. FindWindow API´Â Ŭ·¡½ºÀ̸§À» ÆĶó¸ÞŸ·Î ³Ö¾îÁÖ¸é ±×°ÍÀ¸·Î µî·ÏµÈ À©µµ¿ìÀÇ ÇÚ
µéÀ» µ¹·ÁÁÖ´Â ±â´ÉÀ» ÇÕ´Ï´Ù. FindWindow·Î Ŭ·¡½º¸¦ °Ë»öÇØ ±× À©µµ¿ì ÇÚµéÀÌ Á¸Àç ÇÑ
´Ù¸é ÀÌ¹Ì ÀÚ½ÅÀÌ ¸Þ¸ð¸®¿¡ ·Îµå µÇ¾îÀִٴ°ÍÀ» ÀǹÌÇϹǷΠÀ©µµ¿ì¸¦ Á¾·áÇÏ¸é µÉ°ÍÀÔ´Ï
´Ù. ±×¸®°í À©µµ¿ì°¡ Á¾·áÇÒ¶§´Â ¹Ýµå½Ã SetTimer·Î ÁöÁ¤ÇØÁØ Å¸À̸Ӹ¦ Á¦°ÅÇØ¾ß ÇÕ´Ï´Ù.
Áغñ°úÁ¤ÀÌ ¸ðµÎ ³¡³­ Äڵ带 º¸½ÃÁÒ.

<Áغñ³¡! ÄÚµå>
// AutoFocus.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "AutoFocus.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CAutoFocusApp

BEGIN_MESSAGE_MAP(CAutoFocusApp, CWinApp)
//{{AFX_MSG_MAP(CAutoFocusApp)
//}}AFX_MSG_MAP
// Standard file based document commands
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAutoFocusApp construction

CAutoFocusApp::CAutoFocusApp()
{
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CAutoFocusApp object

CAutoFocusApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CAutoFocusApp initialization

BOOL CAutoFocusApp::InitInstance()
{
CString strWndClass = AfxRegisterWndClass(0,
LoadCursor(IDC_ARROW), 0);

if (FindWindow(strWndClass, NULL))
{
PostQuitMessage(0);
return TRUE;
}

CMyWnd* pWnd = new CMyWnd;
pWnd->CreateEx(0, strWndClass, NULL, 0, CRect(), NULL, NULL);

m_pMainWnd = pWnd;

// CMyWnd¿¡¼­ WM_TIMER¹ß»ý
m_pMainWnd->SetTimer(1000, 700, NULL);

return TRUE;
}

BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
ON_WM_DESTROY() // À©µµ¿ì Æı«½Ã ºÒ¸®´Â ÇÔ¼ö
ON_WM_TIMER()
END_MESSAGE_MAP()


CMyWnd::CMyWnd()
{
}

void CMyWnd::OnDestroy()
{
KillTimer(1000); // ÁöÁ¤µÈ À©µµ¿ì ŸÀÌ¸Ó Á¦°Å
CWnd::OnDestroy();
}

void CMyWnd::OnTimer(UINT nID)
{
OnAutoFocus();
}


À©µµ¿ì¸¦ ã¾Æ¶ó!
--------------
ÀÌÁ¦ ¸ðµç Áغñ°úÁ¤ÀÌ ³¡³µ½À´Ï´Ù. ÀÌÁ¦ WM_TIMER¿¡ ÀÇÇØ ºÒ¸± OnAutoFocus()¸¦ Á¦ÀÛ
ÇÏ´Â °Í¸¸ ³²¾Ò½À´Ï´Ù. ÀÌ°ÍÀÌ ÇÙ½ÉÄÚµåÁÒ. ¿©±â±îÁö ³Ê¹« ¸»ÀÌ ¸¹¾Ò´Âµ¥, ¹èº¸´Ù ¹è²ÅÀÌ Å«
°ÝÀ̱º¿ä. ¿ì¼± ±× ¸ÞÄ«´ÏÁòÀ» »ìÆ캸ÁÒ.
À§¿¡¼­ WindowFromPointÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é ¸¶¿ì½ºÀÇ ÁÂÇ¥¸¦ ÀÌ¿ëÇØ ÇØ´ç À©µµ¿ìÀÇ ÇÚµéÀ»
¾òÀ» ¼ö ÀÖ´Ù°í ÇÏ¿´½À´Ï´Ù. ±×·¯¸é ±×°ÍÀ» È­¸éÀÇ ¸Ç ¾ÕÂÊÀ¸·Î ²ø¾î´ç°ÜÁÖ¸é µÇ°ÚÁÒ. °£´Ü
È÷ ¸¶¿ì½º ÁÂÇ¥¸¦ ¾ò¾î ÇØ´ç À©µµ¿ìÀÇ ÇÚµéÀ» ¾ò´Â OnAutoFocus()¸¦ ¸¸µé¾î º¾½Ã´Ù.

<ÄÚµå...>
void CMyWnd::OnAutoFocus()
{
POINT p;
HWND hwnd;

// ¸¶¿ì½ºÄ¿¼­ ÁÂÇ¥¸¦ ¾ò´Â´Ù. È­¸éÁÂÇ¥°èÀÓ.
GetCursorPos(&p);

// ±× ÁÂÇ¥·ÎºÎÅÍ À©µµ¿ìÀÇ ÇÚµéÀ» ¾òÀ½. ±× ÁÂÇ¥¿¡ À©µµ¿ì ¾øÀ¸¸é NULL.
hwnd = WindowFromPoint(p)->m_hWnd;

// À©µµ¿ì È°¼º!!!
::SetActiveWindow(hwnd);
}

ÇÁ·Î±×·¥ÀÌ ¿Ï¼ºµÈµí ½Í¾ú½À´Ï´Ù. ±×·±µ¥ ½ÇÇàÇغ¸´Ï ¸¶¿ì½º°¡ À§Ä¡ÇÑ °÷ÀÇ À©µµ¿ì´Â ²Þ½
µµ ÇÏÁö ¾Ê¾Ò½À´Ï´Ù. È­°¡³µ½À´Ï´Ù. ±×·¯³ª ÇÁ·Î±×·¡¸Ó´Â 1HzÀÇ ¼Óµµµµ Âü°í °ßµ®¾ß ÇÑ´Ù
´Â ´©±º°¡ÀÇ ¸»ÀÌ ¶°¿Ã¶ú½À´Ï´Ù. ¼Óµµ°¡ ´À¸°°ÍÀº ¾Æ´Ï¾úÁö¸¸ ±×¸¸Å­ Àγ»½ÉÀÌ ÇÊ¿äÇÏ´Ù´Â
¸»¾¸(?)À¸·Î »ý°¢ÇÏ°í õõÈ÷ µð¹ö±ëÀ» Çغ¸¾Ò½À´Ï´Ù. ¸¶¿ì½º ÁÂÇ¥´Â ÈǸ¢ÇÏ°Ô ¾ò¾îÁ³½À´Ï
´Ù. ±×°ÍÀ» ¹Þ´Â WindowFromPointÇÔ¼ö´Â ³Î°ªÀÌ ¾Æ´Ñ ÇÚµéÀ» µ¹·ÁÁÖ¾ú½À´Ï´Ù. ±×·³
SetActiveWindowÀÇ ¹®Á¦À̱º¿ä. SetActiveWindow°¡ µ¹·ÁÁÖ´Â °ªÀ» ÃßÀûÇغ¸´Ï 0À̾ú½À´Ï
´Ù. ¿À·ù°¡ ³­°ÍÀÌÁÒ. VC++ÀÇ SetActiveWindowÀÇ OnLineµµ¿ò¸»À» º¸¾Ò½À´Ï´Ù. ÀÚ¼¼È÷ ÀÐ
¾îº¸´Ï ¾Æ·¡¿Í°°Àº ±ÛÀÌ ¾²¿© ÀÖ´õ±º¿ä.
If the window identified by the hWnd parameter was created by the calling thread, the
active window status of the calling thread is set to hWnd. Otherwise, the active
window status of the calling thread is set to NULL.
¸»ÀÎ Áï½¼, SetActiveWindowÇÔ¼ö¿¡ ÀÇÇØ ÁöÁ¤µÉ À©µµ¿ìÇÚµéÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â thread
¿Í °°Àº thread¿¡ Á¸ÀçÇÒ¶§ À©µµ¿ì Çڵ鰪À» µ¹·ÁÁÖ°í ¾Æ´Ñ°æ¿ì¿£ NULLÀ» Áشٴ°ÍÀÔ´Ï´Ù.
°ð, SetActiveWindowÀ» »ç¿ëÇÏ´Â À©µµ¿ì¿Í µ¿ÀÏÇÑ ÀνºÅϽº¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
µµ¿ò¸» ÇÏ´ÜÀÇ See Also¿¡ ÀûÇô ÀÖ´Â SetForegroundWindow¸¦ ¹ß°ßÇÏÁö ¸øÇÏ¿´´Ù¸é ÁÂÀý
ÇÏ°í ¸»¾ÒÀ» °ÍÀÔ´Ï´Ù. SetForegroundWindow´Â SetActiveWindow¿Í °°Àº ±â´ÉÀ» ¼öÇàÇÏ
Áö¸¸ ¼º°ÝÀÌ Á¶±Ý Ʋ·È½À´Ï´Ù.
The SetForegroundWindow function puts the thread that created the specified window
into the foreground and activates the window. Keyboard input is directed to the window,
and various visual cues are changed for the user.
´ÙÇàÀÌ´õ±º¿ä. SetForegroundWindowÇÔ¼ö´Â ÁöÁ¤µÉ À©µµ¿ìÀÇ thread(instance)¸¦ ¾ÕÂÊÀ¸·Î
²ø¾î´ç°Ü È°¼ºÈ­ ½ÃŲ´Ù´Â °ÍÀ̾ú½À´Ï´Ù. ´Ù¸¥ ÀνºÅϽº¿¡µµ Àû¿ë °¡´ÉÇÏ´Ù´Â °ÍÀÌÁÒ.
±×·¡¼­ ÀÌ°ÍÀ¸·Î ´ëüÇÏ¿´½À´Ï´Ù. ±×¸®°í ½ÇÇàÇغ¸¾Ò½À´Ï´Ù. °¨°ÝÀÇ ´«¹°ÀÌ È带»· Çß½À´Ï
´Ù. ¿ì¸®°¡ ¿øÇÏ´Â ¹Ù ´ë·Î µ¿ÀÛÇß½À´Ï´Ù. ¾î¶ó? ±×·±µ¥ Á¶±Ý ÀÌ»óÇÏ°Ô µ¿ÀÛÇÕ´Ï´Ù. Ž»ö
±âÈ­¸é¿¡¼­ ¸¶¿ì½º¸¦ À̸®Àú¸® ¿Å°Üº¸´Ï Ž»ö±â ÀÚü°¡ ¼±ÅõÇÁö ¾Ê°í ±× ³»ºÎ¿¡ ÀÖ´Â
childwindowµéÀÌ ¼±ÅõǴ °ÍÀ̾ú½À´Ï´Ù. ¹Ù·Î Ž»ö±â¿¡ Æ÷ÇÔµÈ ¿©·¯ ÄÜÆ®·Ñµé, Æú´õÆ®¸®,
ÆÄÀϸ®½ºÆ®, Æú´õ¼±ÅÃÄÞº¸¹Ú½ºµî... ±× ¸ðµç°ÍÀÌ À©µµ¿ì¶ó´Â °ÍÀ» »õ»ï½º·´°Ô ±ú´Þ¾Ò½À´Ï´Ù.
±×·¯´Ï Ž»ö±â ³»ºÎÀÇ Æú´õÆ®¸®ºÎºÐ¿¡ ¸¶¿ì½º¸¦ ¿òÁ÷À̸é Ž»ö±âÀÚü°¡ È°¼ºÈ­ µÇ´Â°ÍÀÌ ¾Æ
´Ï¶ó Æú´õÆ®¸®ÀÚü°¡ ÀÚ²Ù È°¼ºÈ­µÇ¼­ °á°úÀûÀ¸·Î Ž»ö±â´Â ºñÈ°¼ºÈ­ µÇ¾ú½À´Ï´Ù. ±×·³ ÀÌ
°ÍÀ» ¾î¶»°Ô ÇØ°áÇÏ´À³Ä... ¾îÂîµÇ¾úµç À©µµ¿ì´Â ÃÖ»óÀ§ ºÎ¸ðÀ©µµ¿ì°¡ Àֱ⠸¶·ÃÀÔ´Ï´Ù. ±×·¯
¸é ¸¶¿ì½º°¡ ¼±ÅÃÇÑ À©µµ¿ìÀÇ ÃÖ»óÀ§ À©µµ¿ì¸¦ ÃßÀûÇØ µé¾î°¡¸é µÉ°ÍÀÔ´Ï´Ù. À©µµ¿ìÀÇ ºÎ
¸ðÀ©µµ¿ì´Â GetParent¶ó´Â API·Î ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¸é ÇÚµéÀ» ³Ö¾îÁÖ¸é ÃÖ»óÀ§ À©
µµ¿ì¸¦ ÃßÀûÇØ µ¹·ÁÁÖ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÁÒ...

<ÄÚµå...>
HWND CMyWnd::GetTopmostParentWindow(HWND hwnd)
{
HWND hwnd_tmp;

while (1)
{
// ºÎ¸ð À©µµ¿ì´Â?
hwnd_tmp = ::GetParent(hwnd);
// ÃÖ»óÀ§ À©µµ¿ìÀΰ¡?
if (hwnd_tmp == NULL)
break;

// ¾Æ´Ï¸é trace into
hwnd = hwnd_tmp;
}

return hwnd;
}

±×·¡¼­ ÀÌ°ÍÀ» OnAutoFocus()ÇÔ¼ö¿¡ Àû¿ë½ÃÄÑ º¸¾Ò½À´Ï´Ù.

<ÄÚµå...>
void CMyWnd::OnAutoFocus()
{
POINT p;
HWND hwnd;

// ¸¶¿ì½ºÄ¿¼­ ÁÂÇ¥¸¦ ¾ò´Â´Ù. È­¸éÁÂÇ¥°èÀÓ.
GetCursorPos(&p);

// ±× ÁÂÇ¥·ÎºÎÅÍ À©µµ¿ìÀÇ ÇÚµéÀ» ¾òÀ½. ±× ÁÂÇ¥¿¡ À©µµ¿ì ¾øÀ¸¸é NULL.
hwnd = WindowFromPoint(p)->m_hWnd;

// ÃÖ»óÀ§ À©µµ¿ì¸¦ ãÀ½!
hwnd = GetTopmostParentWindow(hwnd);

::SetForegroundWindow(hwnd);
}

ÀÌÁ¦ Àß µÉ±î? ÄÄÆÄÀÏÇØ ½ÇÇà½ÃÅ°°í À©µµ¿ìŽ»ö±â¸¦ ¶ç¿ü½À´Ï´Ù. Àß µÇ´Âµí Çß½À´Ï´Ù. ÁÂÃø »ó´ÜÀÇ Æú´õ
¼±ÅÃÄÞº¸¹Ú½º¸¦ ¿­¾îº¸¾Ò½À´Ï´Ù. ¾Ñ! ±×·±µ¥ °ð¹Ù·Î ½º½º·Î ÄÞº¸¹Ú½º°¡ ´ÝÇô¹ö·È½À´Ï´Ù. À¢
ÀÏÀϱî? °õ°õÈ÷ »ý°¢Çغ¸´Ï ŸÀ̸Ӱ¡ ¿øÀÎÀ̾ú½À´Ï´Ù. ÄÞº¸¹Ú½º¸¦ ¼±ÅÃÇÏ´Â µµÁß¿¡µµ Ÿ
À̸Ӱ¡ ¹ß»ýÇØ À©µµ¿ìŽ»ö±â°¡ ÀçÈ°¼ºÈ­µÇ¾î ÄÞº¸¹Ú½º°¡ ½º½º·Î ´ÝÈù°ÍÀÔ´Ï´Ù. ÀÌ°ÍÀ» ÇØ
°áÇÏ·Á°í ¸Ó¸®¸¦ ±¼¸®´Ù°¡ ¹æ¹ýÀÌ ¶°¿Ã¶ú½À´Ï´Ù. ¸¶¿ì½º Ä¿¼­°¡ ÇÑ À©µµ¿ìÀÇ ¿µ¿ªÀ» ¹ù¾î
³ªÁö ¾Ê´Âµ¿¾ÈÀº ŸÀÌ¸Ó ¸Þ¼¼Áö°¡ ¹ß»ýÇصµ ÀçÈ°¼ºÈ­¸¦ ÇÏÁö ¾Ê´Â°ÍÀÔ´Ï´Ù. ±×·¡¼­ Äڵ带
À籸¼ºÇغ¸¾Ò½À´Ï´Ù.

<À籸¼ºµÈ ÄÚµå~~>
void CMyWnd::OnAutoFocus()
{
POINT p;
static HWND last_hwnd = NULL;
HWND hwnd;

GetCursorPos(&p);

hwnd = WindowFromPoint(p)->m_hWnd;

hwnd = GetTopmostParentWindow(hwnd);

// °è¼Ó °°Àº À©µµ¿ì ¾È¿¡ ¸¶¿ì½º Ä¿¼­°¡ Àִ°¡?
if (hwnd == last_hwnd)
return;

::SetForegroundWindow(hwnd);

last_hwnd = hwnd;
}

ÇÏÇÏ! ¿Ï¼ºÇß½À´Ï´Ù. ´Ù½Ã ½ÇÇàÇؼ­ ÀÚ½ÅÀÖ°Ô Å½»ö±â¸¦ µ¹·Áº¸¾Ò½À´Ï´Ù. ±×¸®°í ´Ù½Ã Æú´õ¼±
ÅÃÄÞº¸¹Ú½º¸¦ ¿­¾îº¸¾Ò½À´Ï´Ù. ±×·±µ¥ ¿ª½Ã ¶Ç ´ÝÇô¹ö·È½À´Ï´Ù. À̹ø¿£ ÀÌÀ¯¸¦ ÃßÃøÇÒ ¼ö
¾ø¾ú½À´Ï´Ù. µµµ¥Ã¼ ¿ÖÀϱî? ¿Ö? ¿Ö? ¿Ö??? ¶Ç ´Ù½Ã µð¹ö±ë¸ðµå·Î µé¾î°¬½À´Ï´Ù. ÀǽÉÀÌ
°¡´Â ÄÚµåÀÇ Ãâ·Â°ªÀ» Á¶»çÇØ º¸¾Ò½À´Ï´Ù. ±×·±µ¥ ¿À¿À... ¿Ïº®ÇÏ´Ù°í ¹Ï°í ÀÖ¾ú´ø ÄÚµå...
GetTopmostParentWindow°¡ µ¹·ÁÁÖ´Â ÃÖ»óÀ§ ÇÚµéÀÇ °ªÀÌ Å½»ö±â ¾È¿¡¼­ º¯ÇÏ´Â °ÍÀ̾ú½À
´Ï´Ù. "¸»µµ¾ÈµÅ... ºÎ¸ð°¡ Çϳª°¡ ¾Æ´Ñ°¡???" ±×·¯³ª °Ü¿ì ¾Ë ¼ö ÀÖ¾ú½À´Ï´Ù. À©µµ¿ìÁî°¡ ±â
º»ÀûÀ¸·Î Á¦°øÇÏ´Â ÄÜÆ®·ÑµéÀÌ ¶Ç ³»ºÎÀûÀ¸·Î »ý¼ºÇÏ´Â ±×°ÍÀÇ Â÷ÀϵåÀ©µµ¿ìµé¿¡°Ô Ç×»ó ºÎ
¸ðÀ©µµ¿ìÀÇ °ªÀ» À¯Áö½ÃÄÑÁÖÁö´Â ¾Ê´Â´Ù´Â°ÍÀ»... Æú´õ¼±ÅÃÄÞº¸¹Ú½º¸¦ ÆîÃÆÀ»¶§ »ý°Ü³ª´Â
±× ÄÞº¸¹Ú½ºÀÇ Â÷Àϵå À©µµ¿ìµé¿¡°Ô ºÎ¸ðÀ©µµ¿ìÀÇ °ªÀ» ÇÊ¿ä°¡ ¾ø¾ú´ÂÁö, ±×°ÍÀ» ÀÔ·ÂÇØÁÖÁö ¾Ê¾Ò±â
¶§¹®¿¡ ±× Â÷ÀϵåÀ©µµ¿ìÀÇ ºÎ¸ð°ªÀÌ NULLÀÌ µÇ¾î Æú´õ¼±ÅÃÄÞº¸¹Ú½º¶ó´Â ¾ö¿¬ÇÑ ºÎ¸ð°¡ Á¸
ÀçÇϴµ¥µµ ºÒ±¸ÇÏ°í ÀÚ½ÅÀÌ ºÎ¸ð·Î ¼±ÅÃµÇ¾î ¹ö¸°°ÍÀÔ´Ï´Ù. Parent ChainÀÌ ²÷±ä°ÍÀÌÁÒ.
¹«Ã´ ³­°¨Çß½À´Ï´Ù. ´õÀÌ»óÀÇ ¹æ¹ýÀÌ ³ª¿Ã°Í °°Áö°¡ ¾Ê¾Ò½À´Ï´Ù. ±×³É ±×°ÍÀ» ¿µ¿µ ¹ö±×·Î
³²°ÜµÎ°í ½Í¾ú½À´Ï´Ù. ±ÍÂú¾Æ¼­... ±×·¯³ª ±×·² ¼ö´Â ¾ø¾ú½À´Ï´Ù. Á˾ø´Â OnLineµµ¿ò¸»À» ¿­
¾î ÆîÃÆ´Ù ´Ý¾Ò´Ù ÇÏ°í ÀÖ¾ú½À´Ï´Ù. ±×¶§ ¾î·ÅDzÀÌ ÀÌ·±»ý°¢ÀÌ ¶°¿Ã¶ú½À´Ï´Ù. "À©µµ¿ì ÇÁ·Î
±×·¥¿¡¼­ ´ÜÀÏÇÑ°ÍÀÌ ¹»±î." ±×°ÍÀº Instance¿´½À´Ï´Ù. "±×·¡, ¸ðµç À©µµ¿ìÀÇ Instance´Â µ¿
ÀÏÇÏ´Ï ±×°ÍÀ» ºñ±³ÇÏ¸é µÉ²¨¾ß."

µåµð¾î AutoFocus¸¦ ¿Ï¼ºÇÏ´Ù!
--------------------------
´Ù¸¥ À©µµ¿ìÀÇ ÀνºÅϽº¸¦ ¾ò±âÀ§Çؼ­´Â subclassingÀ» ÀÌ¿ëÇÏ¸é µË´Ï´Ù. subclassingÀ» Àß
¸¸¾²¸é ÈǸ¢ÇÏ°Ô hookingÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿ì¼± Äڵ带 º¸½ÃÁÒ. °£´ÜÇÕ´Ï´Ù.

<¿Ï¼ºµÈ ÄÚµå...>
void CMyWnd::OnAutoFocus()
{
POINT p;
static LONG last_inst = 0;
static HWND last_hwnd = NULL;
HWND hwnd;
LONG inst;

GetCursorPos(&p);

hwnd = WindowFromPoint(p)->m_hWnd;

// À©µµ¿ìÀÇ instance¸¦ ¾ò´Â´Ù. subclassing
inst = ::GetWindowLong(hwnd, GWL_HINSTANCE);

hwnd = GetTopmostParentWindow(hwnd);

// ¹Ù·Î Àü ÀνºÅϽº¿Í ÇöÀç ÀνºÅϽº°¡ °°°Å³ª,
// ¹Ù·Î Àü À©µµ¿ì ÇÚµé°ú ÇöÀç À©µµ¿ì ÇÚµéÀÌ °°À¸¸é,
// SetForegroundWindow¼öÇà ÇÏÁö ¾ÊÀ½.
if (inst == last_inst || hwnd == last_hwnd)
return;

::SetForegroundWindow(hwnd);

last_inst = inst;
last_hwnd = hwnd;
}


µåµð¾î AutoFocus¸¦ ¿Ï¼ºÇß½À´Ï´Ù. ÀüüÀûÀ¸·Î º¸¸é ´Ü¼øÇÑ°ÍÀ» »ó´çÈ÷ º¹ÀâÇÏ°Ô ÇÑ ´À³¦
ÀÌ µéÁÒ? ¾î¶µç Ž»ö±â¿¡¼­µµ Àß µ¹¾Æ°¡°í ¾îµð¿¡¼­µç Àß µ¹¾Æ°©´Ï´Ù. Àç¹ÌÀÖ´Â À¯Æ¿¸®Æ¼
°¡ ¿Ï¼ºµÈ°ÅÁÒ.

ÇöÀç ÀÌ ÇÁ·Î±×·¥Àº ±× Á¸À縦 ÇÁ·Î¼¼½º¸Þ´ÏÀú°¡ ¾øÀÌ´Â È®ÀÎÇϱ⠾î·Æ½À´Ï´Ù. Taskbar¿¡
µµ ³ªÅ¸³ªÁö ¾Ê°í È­¸é¿¡µµ º¸À̴°ÍÀÌ ¾ø±â ¶§¹®ÀÌÁÒ. ÀÛµ¿Çϴ°ÍÀ» º¸°í Á÷Á¢ÀûÀÎ È®ÀÎÀº
°¡´ÉÇÕ´Ï´Ù¸¸... ¾î¶µç ÇÁ·Î±×·¥À» Á¾·áÇÒ ¼ö ÀÖµµ·Ï ÇØÁִ°ÍÀÌ ¿¹ÀÇÀÎ°Í °°¾Æ¼­ ´ÙÀ½ °­
Á¿¡¼­´Â TaskbarÀÇ ¿À¸¥ÂÊ(½Ã°èÀִºκÐ)¿¡ ¾ÆÀÌÄÜÀ» Ãß°¡ÇÏ¿© AutoFocus¸¦ Á¶ÀýÇÒ ¼ö ÀÖ
µµ·Ï ÇÏ°Ú½À´Ï´Ù.