´Ù.¸ð´ÏÅÍ Á¤º¸ Á¶»ç

ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ´ÙÁß ¸ð´ÏÅÍ È¯°æÀ» Á÷Á¢ ´Ù·ç°Å³ª ´ÙÁß ¸ð´ÏÅÍ·Î ÀÎÇÑ ¹®Á¦Á¡À» ÇØ°áÇÏ·Á¸é ¸ÕÀú ½Ã½ºÅÛ¿¡ ÀåÂøµÈ ¸ð´ÏÅÍ¿¡ ´ëÇÑ Á¤º¸¸¦ Á¶»çÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ½Ã½ºÅÛÀÇ ¸ðµç ¸ð´ÏÅÍ ¶Ç´Â ƯÁ¤ DC¿Í °ü·ÃµÈ ¸ð´ÏÅ͸¦ ¿­°ÅÇÑ´Ù.

 

BOOL EnumDisplayMonitors(HDC hdc, LPCRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData);

 

hdc¿Í lprcClip Àμö¿¡ ´ëÇؼ­´Â Àá½Ã ÈÄ µû·Î Á¤¸®ÇØ º¸±â·Î Ç쵂 ÀÌ °ªÀÌ µÑ ´Ù NULLÀÌ¸é ¸ðµç ¸ð´ÏÅÍ°¡ ¿­°ÅµÈ´Ù. lpfnEnum Àμö´Â ¸ð´ÏÅÍ°¡ ¹ß°ßµÉ ¶§¸¶´Ù È£ÃâµÉ Äݹé ÇÔ¼öÀ̸ç dwData´Â ÀÌ ÇÔ¼ö·Î Àü´ÞµÉ »ç¿ëÀÚ Á¤ÀÇ°ªÀÌ´Ù. Äݹé ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¿øÇüÀ» °¡Áø´Ù.

 

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData);

 

ù¹ø° Àμö hMonitor´Â ¹ß°ßµÈ ¸ð´ÏÅÍÀÇ ÇÚµéÀε¥ ÀÌ ÇÚµé·ÎºÎÅÍ ¸ð´ÏÅÍÀÇ »ó¼¼ÇÑ Á¤º¸¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. hdcMonitor´Â ÀÌ ¸ð´ÏÅÍ ¿µ¿ª¿¡ ±×¸®±â¸¦ ÇÒ ¶§ »ç¿ëÇÒ DC ÇÚµéÀ̸ç lprcMonitor´Â ¸ð´ÏÅÍÀÇ ÁÂÇ¥°ªÀε¥ Àá½Ã ÈÄ µû·Î Á¤¸®Çϵµ·Ï ÇÏÀÚ. ¿­°Å¸¦ °è¼ÓÇÏ·Á¸é TRUE¸¦ ¸®ÅÏÇÏ°í ¿­°Å¸¦ ÁßÁöÇÏ·Á¸é FALSE¸¦ ¸®ÅÏÇÏ¸é µÈ´Ù. ¿øÇÏ´Â ¸ð´ÏÅ͸¦ ã¾ÒÀ» ¶§ FALSE¸¦ ¸®ÅÏÇÏ¸é ¸ð´ÏÅÍ ¿­°Å°¡ ³¡³­´Ù. ¸ð´ÏÅÍÀÇ ÇÚµé·ÎºÎÅÍ ¸ð´ÏÅÍÀÇ Á¤º¸¸¦ Á¶»çÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

BOOL GetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi);

 

MONITORINFO(EX) ±¸Á¶Ã¼¸¦ ¼±¾ðÇÑ ÈÄ ÀÌ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇÏ¸é ¸ð´ÏÅÍ °ü·Ã Á¤º¸¸¦ ±¸Á¶Ã¼¿¡ ä¿öÁØ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

 

typedef struct tagMONITORINFOEX { 

  DWORD  cbSize;

  RECT   rcMonitor;

  RECT   rcWork;

  DWORD  dwFlags;

  TCHAR  szDevice[CCHDEVICENAME];

} MONITORINFOEX, *LPMONITORINFOEX;


°¢ ¸â¹öÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.

 

¸â¹ö

¼³¸í

cbSize

ÀÌ ±¸Á¶Ã¼ÀÇ Å©±âÀÌ¸ç ±¸Á¶Ã¼ ¹öÀü È®Àο¡ »ç¿ëµÈ´Ù. GetMonitorInfo ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ÀÌ ¸â¹ö¿¡ ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ¹Ýµå½Ã ´ëÀÔÇØ ÁÖ¾î¾ß ÇÑ´Ù.

rcMonitor

°¡»ó È­¸é»óÀÇ ¸ð´ÏÅÍ ÁÂÇ¥ÀÌ´Ù. ¿ÞÂÊÀ̳ª À§ÂÊ¿¡ ÀÖ´Â ¸ð´ÏÅÍ´Â À½¼ö ÁÂÇ¥¸¦ °¡Áú °ÍÀÌ´Ù.

rcWork

°¡»ó È­¸é»óÀÇ ¿öÅ© ¿¡¸®¾î ÁÂÇ¥ÀÌ´Ù. rcMonitor ¿µ¿ª¿¡¼­ ¾Û¹Ù ¿µ¿ªÀ» Á¦¿ÜÇÑ ¿µ¿ªÀÌ´Ù.

dwFlags

ÁÖ ¸ð´ÏÅÍÀÏ °æ¿ì MONITORINFOF_PRIMARY°¡ Àü´ÞµÈ´Ù.

szDevice

¸ð´ÏÅÍÀÇ À̸§ÀÌ´Ù.

 

´ÙÀ½ ¿¹Á¦´Â ½Ã½ºÅÛ¿¡ ÀåÂøµÈ ¸ðµç ¸ð´ÏÅÍÀÇ Á¤º¸¸¦ Á¶»çÇØ ÁØ´Ù.

 

#define WINVER 0x0500

#include <windows.h>

....

int y;

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor,HDC hdcMonitor,LPRECT lprcMonitor,LPARAM dwData)

{

   TCHAR sInfo[256];

   MONITORINFOEX mi;

 

   mi.cbSize=sizeof(MONITORINFOEX);

   GetMonitorInfo(hMonitor,&mi);

   wsprintf(sInfo,"¸ð´ÏÅÍ ÇÚµé = %x, ÁÂÇ¥=(%d,%d)-(%d,%d) %s",hMonitor,

      lprcMonitor->left,lprcMonitor->top,lprcMonitor->right,lprcMonitor->bottom,

      (mi.dwFlags & MONITORINFOF_PRIMARY)==0 ? "":"ÁÖ ¸ð´ÏÅÍ");

   TextOut((HDC)dwData,10,y,sInfo,lstrlen(sInfo));

   y+=20;

   return TRUE;

}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

   HDC hdc;

   PAINTSTRUCT ps;

   TCHAR Mes[256];

   int cMon;

   RECT rcVirt;

 

   switch(iMessage) {

   case WM_LBUTTONDOWN:

   case WM_DISPLAYCHANGE:

      InvalidateRect(hWnd,NULL,TRUE);

      UpdateWindow(hWnd);

      return 0;

   case WM_PAINT:

      hdc=BeginPaint(hWnd, &ps);

      cMon=GetSystemMetrics(SM_CMONITORS);

      if (cMon == 0) {

          lstrcpy(Mes,"´ÙÁß ¸ð´ÏÅ͸¦ Áö¿øÇÏÁö ¾Ê´Â ½Ã½ºÅÛÀÔ´Ï´Ù");

          TextOut(hdc,10,10,Mes,lstrlen(Mes));

      } else {

          wsprintf(Mes,"¸ð´ÏÅÍ °³¼ö = %d, »ö»ó Æ÷¸Ë=%s",cMon,

             GetSystemMetrics(SM_SAMEDISPLAYFORMAT) ? "¸ðµÎ µ¿ÀÏ":"´Ù¸§");

          TextOut(hdc,10,10,Mes,lstrlen(Mes));

 

          rcVirt.left=GetSystemMetrics(SM_XVIRTUALSCREEN);

          rcVirt.top=GetSystemMetrics(SM_YVIRTUALSCREEN);

          rcVirt.right=rcVirt.left+GetSystemMetrics(SM_CXVIRTUALSCREEN);

          rcVirt.bottom=rcVirt.top+GetSystemMetrics(SM_CYVIRTUALSCREEN);

          wsprintf(Mes,"°¡»ó È­¸é=(%d,%d)-(%d,%d)",rcVirt.left,rcVirt.top,

             rcVirt.right,rcVirt.bottom);

          TextOut(hdc,10,30,Mes,lstrlen(Mes));

 

          y=50;

          EnumDisplayMonitors(NULL,NULL,MonitorEnumProc,(LPARAM)hdc);

      }

      EndPaint(hWnd, &ps);

      return 0;

   case WM_DESTROY:

      PostQuitMessage(0);

      return 0;

   }

   return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

´ÙÁß ¸ð´ÏÅÍ ½Ã½ºÅÛÀº 98ÀÌÈÄ 2000ÀÌÈÄ¿¡¼­¸¸ Áö¿øµÈ´Ù. Áï À©µµ¿ìÁî 95¿Í NT´Â ´ÙÁß ¸ð´ÏÅÍ È¯°æÀ» Áö¿øÇÏÁö ¾ÊÀ¸¸ç ºñÁÖ¾ó C++ 6.0ÀÇ ±âº» ÄÄÆÄÀÏ È¯°æÀÌ À©µµ¿ìÁî 95·Î ¸ÂÃß¾îÁ® Àֱ⠶§¹®¿¡ ´ÙÁß ¸ð´ÏÅÍ °ü·Ã ÇÔ¼ö¸¦ È£ÃâÇÏ·Á¸é windows.h¸¦ ÀÎŬ·çµåÇϱâ Àü¿¡ WINVER ¸ÅÅ©·Î¸¦ 0x500 ÀÌ»óÀ¸·Î Á¤ÀÇÇØ ÁÖ¾î¾ß ÇÑ´Ù. µÎ °³ÀÇ ¸ð´ÏÅÍ°¡ ÀåÂøµÈ ½Ã½ºÅÛ¿¡¼­ ÀÌ ¿¹Á¦¸¦ ½ÇÇàÇÑ °á°ú´Â ´ÙÀ½°ú °°´Ù.

¸ð´ÏÅÍÀÇ °³¼ö´Â SM_CMONITORS ¸ÞÆ®¸¯½º·Î °£´ÜÇÏ°Ô Á¶»çÇÒ ¼ö Àִµ¥ ¸¸¾à ÀÌ °ªÀÌ 0À̶ó¸é ¾Æ¿¹ ´ÙÁß ¸ð´ÏÅ͸¦ Áö¿øÇÏÁö ¾Ê´Â 95/NT ½Ã½ºÅÛÀÌ´Ù. ÀÌ °ªÀÌ 1À̶ó¸é ÁÖ ¸ð´ÏÅÍ Çϳª¸¸ ÀÖ´Â »óÅÂÀÌ°í 2ÀÌ»óÀÌ¸é ´ÙÁß ¸ð´ÏÅÍ È¯°æÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. 95/NT ȯ°æ¿¡¼­´Â ´ÙÁß ¸ð´ÏÅÍ °ü·Ã ÇÔ¼ö¸¦ È£ÃâÇؼ­´Â ¾ÈµÇ¸ç SM_CMONITORS°¡ 0À» ¸®ÅÏÇÑ´Ù°í Çؼ­ ÀåÂøµÈ ¸ð´ÏÅÍ°¡ ¾ø´Ù°í ÆÇ´ÜÇؼ­µµ ¾ÈµÈ´Ù.

¸ð´ÏÅ͵éÀÇ »ö»ó Æ÷¸Ë µ¿Àϼº ¿©ºÎ³ª °¡»ó È­¸éÀÇ ¹üÀ§´Â ¸ÞÆ®¸¯½º°ªÀ¸·Î °£´ÜÈ÷ Á¶»çÇÒ ¼ö ÀÖ´Ù. °¢°¢ÀÇ ¸ð´ÏÅÍ¿¡ ´ëÇÑ Á¤º¸¸¦ Á¶»çÇÏ·Á¸é EnumDisplayMonitor ÇÔ¼ö·Î ¸ð´ÏÅÍ ¿­°Å¸¦ ÇÑ ÈÄ Äݹé ÇÔ¼ö¿¡¼­ Á¶»çµÇ´Â ¸ð´ÏÅÍ Çڵ鿡 ´ëÇØ GetMonitorInfo ÇÔ¼ö¸¦ È£ÃâÇØ º¸¸é µÈ´Ù. ¿¹Á¦ÀÇ ½ÇÇà °á°ú¸¦ º¸¸é ÁÖ ¸ð´ÏÅÍ°¡ ¿ÞÂÊ¿¡ ÀÖ°í Ãß°¡ ¸ð´ÏÅÍ°¡ ¿À¸¥ÂÊ¿¡ ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.

ÀÌ·± ½ÄÀ¸·Î ¸ð´ÏÅ͸¦ ¿­°ÅÇØ º¸¸é ½Ã½ºÅÛ¿¡ ÀåÂøµÈ ¸ð´ÏÅÍÀÇ ¸ñ·Ï°ú °¢ ¸ð´ÏÅÍÀÇ Æ¯¼ºÀ» Á¶»çÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÀÌ Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î ÀÚ½ÅÀÇ À§Ä¡³ª ÁÂÇ¥ÀÇ À¯È¿¼ºÀ» Á¡°ËÇÏ¸é µÈ´Ù. ´ÙÀ½Àº Àá½Ã ¼³¸íÀ» º¸·ùÇØ µÎ¾ú´ø EnumDisplayMonitors ÇÔ¼öÀÇ µÎ Àμö¿¡ ´ëÇØ Á¤¸®ÇØ º¸ÀÚ. hdc Àμö°¡ Àü´ÞµÇ¸é ÀÌ DC ¿µ¿ªÀÌ °ÉÃÄ ÀÖ´Â ¸ð´ÏÅÍ¿¡ ´ëÇؼ­¸¸ Á¶»çµÇ¸ç Äݹé ÇÔ¼öÀÇ Ã¹¹ø° Àμö·Î ÇØ´ç ¸ð´ÏÅÍ¿¡ Ãâ·ÂÇÒ ¼ö ÀÖ´Â DC ÇÚµéÀÌ Àü´ÞµÈ´Ù. ÀÌ DC ÇÚµé·Î ±×¸®±â¸¦ Çϸé ÇØ´ç ¸ð´ÏÅÍÀÇ Æ¯¼º¿¡ ¸Â´Â Ä¿½ºÅÒ ±×¸®±â¸¦ ÇÒ ¼ö ÀÖ´Ù.

EnumDisplayMonitors ÇÔ¼öÀÇ µÎ¹ø° Àμö lprcClipÀº Ŭ¸®ÇÎ ¿µ¿ªÀ» ÁöÁ¤Çϴµ¥ ÀÌ ¿µ¿ªÀÌ °ÉÃÄ ÀÖ´Â ¸ð´ÏÅÍ¿¡ ´ëÇؼ­¸¸ Á¶»çµÈ´Ù. ÀÛ¾÷ ¿µ¿ªÀÇ ÀϺθ¸ ±×¸®±â¸¦ ÇÒ ¶§ Ŭ¸®ÇÎ ¿µ¿ªÀ» ÁöÁ¤Çϸé Äݹé ÇÔ¼öÀÇ lprcMonitor Àμö·Î Ŭ¸®ÇÎ ¿µ¿ª°ú °ãÃÄÁö´Â ¸ð´ÏÅÍ ¿µ¿ªÀÌ Àü´ÞµÇ¹Ç·Î ÀÌ ¿µ¿ª¿¡ ´ëÇؼ­¸¸ ±×¸®±â¸¦ ÇÏ¸é µÈ´Ù.

ÀÌ µÎ Àμö°¡ ¸ðµÎ NULLÀ̸é ÀåÂøµÈ ¸ðµç ¸ð´ÏÅÍ¿¡ ´ëÇÑ Á¤º¸°¡ Á¶»çµÇ¸ç ÀÌ µÎ ÀμöÁß Çϳª ¶Ç´Â ÀüºÎ°¡ Àü´ÞµÉ °æ¿ì Á¶»çµÇ´Â Á¤º¸°¡ ´Þ¶óÁø´Ù. ´ÙÀ½ µµÇ¥´Â EnumDisplayMonitors ÇÔ¼öÀÇ µÎ Àμö°ªÀÇ Á¶ÇÕ°ú Á¶»çµÇ´Â Á¤º¸µéÀ» Á¤¸®ÇÑ °ÍÀÌ´Ù.

 

hdc

lprcClip

Á¤º¸

NULL

NULL

¸ðµç ¸ð´ÏÅÍÀÇ Á¤º¸¸¦ Á¶»çÇϸç Äݹé ÇÔ¼ö·Î´Â NULL DC°¡ Àü´ÞµÈ´Ù.

NULL

¾ÈNULL

Ŭ¸®ÇÎ ¿µ¿ª°ú ±³Â÷µÇ´Â ¸ð´ÏÅÍ ¿µ¿ªÀÌ Á¶»çµÈ´Ù. À̶§ Ŭ¸®ÇÎ ¿µ¿ª°ú Äݹé ÇÔ¼ö°¡ Àü´Þ¹Þ´Â ÁÂÇ¥°ªÀº ¸ðµÎ °¡»ó È­¸é ÁÂÇ¥ÀÌ´Ù.

¾ÈNULL

NULL

DC¿Í ±³Â÷µÇ´Â ¸ð´ÏÅÍ ¿µ¿ªÀÌ Á¶»çµÈ´Ù. Äݹé ÇÔ¼ö´Â °¢ ¸ð´ÏÅÍ ¿µ¿ª¿¡ ÇØ´çÇÏ´Â DC°ªÀ» ¹Þ´Â´Ù.

¾ÈNULL

¾ÈNULL

DCÀÇ Å¬¸®ÇÎ ¿µ¿ª°ú ±³Â÷µÇ´Â ¸ð´ÏÅÍ ¿µ¿ªÀÌ Á¶»çµÈ´Ù. À̶§ Ŭ¸®ÇÎ ¿µ¿ª°ú Äݹé ÇÔ¼ö°¡ Àü´Þ¹Þ´Â ÁÂÇ¥°ªÀº ¸ðµÎ À©µµ¿ì ÁÂÇ¥ÀÌ´Ù. Äݹé ÇÔ¼ö´Â °¢ ¸ð´ÏÅÍ ¿µ¿ª¿¡ ÇØ´çÇÏ´Â DC°ªÀ» ¹Þ´Â´Ù.

 

 MonitorInfo ¿¹Á¦¿¡¼­ ÀÌ µÎ Àμö°ªÀ» º¯°æÇØ °¡¸ç Å×½ºÆ®ÇØ º¸¸é ¾î¶² Á¤º¸°¡ Á¶»çµÇ´ÂÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ Á¤º¸µéÀ» »ç¿ëÇÏ´Â ¿¹Á¦´Â ¹Ù·Î ´ÙÀ½ Ç׿¡¼­ ÀÛ¼ºÇØ º¼ °ÍÀÌ´Ù.

´ÙÁß ¸ð´ÏÅÍ È¯°æÀº ½Ã½ºÅÛÀ» ºÎÆÃÇÒ ¶§ °áÁ¤µÇ´Â °ÍÀÌ ¾Æ´Ï¶ó »ç¿ëÀÚ¿¡ ÀÇÇØ ¾ðÁ¦µçÁö º¯°æµÉ ¼ö ÀÖ´Ù. À̶§¸¶´Ù ½Ã½ºÅÛÀº ¸ðµç ž ·¹º§ À©µµ¿ì¿¡°Ô WM_DISPLAYCHANGE ¸Þ½ÃÁö¸¦ º¸³» Áִµ¥ ¸ð´ÏÅÍ ±¸¼º¿¡ µû¶ó µ¿ÀÛÀÌ ´Þ¶óÁ®¾ß ÇÑ´Ù¸é ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇØ¾ß ÇÑ´Ù. ½Ã½ºÅÛÀº ¸ð´ÏÅÍ ±¸¼ºÀÌ ¹Ù²ð ¶§ ÁÖ ¸ð´ÏÅÍ¿¡ ÀÖÁö ¾ÊÀº À©µµ¿ì¸¦ ÁÖ ¸ð´ÏÅÍ ¾ÈÀ¸·Î À̵¿½ÃÄÑ ÁֹǷΠÀÌ ¸Þ½ÃÁö¸¦ ²À ó¸®ÇØ¾ß ÇÒ ÇÊ¿ä´Â °ÅÀÇ ¾ø´Ù.