C# 윈도우 위치,크기 정보얻기 GetWindowPlacement

GetWindowPlacement

실행중인 응용프로그램 창의 위치와 사이즈를 얻어낼 때 사용한다.

 

선언:

[DllImport("user32.dll")]
internal static extern bool GetWindowPlacement(int hWnd, ref WINDOWPLACEMENT lpwndpl);

 

 

 

 

함수 정의:

internal struct WINDOWPLACEMENT
{
	public int length;
	public int flags;
	public ShowWindowCommands showCmd;
	public System.Drawing.Point ptMinPosition;
	public System.Drawing.Point ptMaxPosition;
	public System.Drawing.Rectangle rcNormalPosition;
}

internal enum ShowWindowCommands : int
{
	Hide = 0,
	Normal = 1,
	Minimized = 2,
	Maximized = 3,
}

internal enum WNDSTATE : int
{
	SW_HIDE = 0,
	SW_SHOWNORMAL = 1,
	SW_NORMAL = 1,
	SW_SHOWMINIMIZED = 2,
	SW_MAXIMIZE = 3,
	SW_SHOWNOACTIVATE = 4,
	SW_SHOW = 5,
	SW_MINIMIZE = 6,
	SW_SHOWMINNOACTIVE = 7,
	SW_SHOWNA = 8,
	SW_RESTORE = 9,
	SW_SHOWDEFAULT = 10,
	SW_MAX = 10
}

private static WINDOWPLACEMENT GetPlacement(int hwnd)
{
	WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
	placement.length = Marshal.SizeOf(placement);
	GetWindowPlacement(hwnd, ref placement);
	return placement;
}

private void GetWindowPos(int hwnd, ref int ptrPhwnd, ref int ptrNhwnd, ref Point ptPoint, ref Size szSize, ref WNDSTATE intShowCmd)
{
	WINDOWPLACEMENT wInf = new WINDOWPLACEMENT();
	wInf.length = System.Runtime.InteropServices.Marshal.SizeOf(wInf);
	GetWindowPlacement(hwnd, ref wInf);
	szSize = new Size(wInf.rcNormalPosition.Right - (wInf.rcNormalPosition.Left * 2),wInf.rcNormalPosition.Bottom - (wInf.rcNormalPosition.Top * 2));
	ptPoint = new Point(wInf.rcNormalPosition.Left, wInf.rcNormalPosition.Top);
}

 

 

 

 

 

 

호출 :

GetWindowPos(핸들, ref ptrPhwnd, ref ptrNhwnd, ref ptPoint, ref szSize, ref intShowCmd);

 

핸들은 FindWindow 참고

 

ptPoint의 X, Y에 위치값이 저장되는데 이는 윈도우프레임을 포함한 LEFT, UP이다.

사이즈역시 프레임까지 포함된 크기이다.

 

특정 창의 전체영역이나 일부분을 캡쳐한다거나 입력도구의 입력을 발생시키거나 할때,

그 창이 어느위치에 있던지 상관없이 적용시킬 수 있다.

 

특정 부분의 좌표를 이용할때는, 프레임크기 변화에 의한 범용성을 신경써 주어야한다.

예를들어,

윈도우7의 Aero스타일의 창프레임에 비해 고전스타일의 프레임은 가로 4px, 세로7px만큼 작게 나온다.

Aero에서 ptPoint.X + 100, ptPoint.Y + 100 의 위치는

고전스타일에서 ptPoint.X + 96, ptPoint.Y + 93 이다.

 

'.NET > WinAPI' 카테고리의 다른 글

C# 키보드이벤트  (0) 2014.01.19
C# 마우스이벤트  (0) 2014.01.18
C# 핫키 설정 RegisterHotKey  (0) 2013.12.28
C# 윈도우핸들 얻기 FindWindow  (0) 2013.12.20
C#에 Windows API 사용하기  (0) 2013.12.19