Programming/Windows API
SetWindowPos함수는 Window의 형태, 크기, 표시Leve등 Window의 속성을 변경하는 함수입니다.

Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
▶VB.NET 선언

[DllImport("user32")]
public static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
▶C# 선언

SetWindowPos함수의 첫번째 인수는 변경할 대상 Window의 Handle을 지정하고 두번째 인수는 해당 Window를 표시할 Level을 지정하는 것으로 다음 상수를 사용합니다.

 상수  값  설명
 HWND_NOTOPMOST  -2  최상위 Window의 바로 다음 위치로 이동
 HWND_TOP  0  바로 다음 상위로 이동
 HWND_BOTTOM  1  최상위로 이동
 HWND_TOPMOST  -1  최상위로 이동, Focus를 잃더라도 level을 유지

단, 만일 이 인수가 특정 Window의 Handle이라면 해당 Window의 상위에 위치하게 됩니다.

세번째와 네번째인수로는 해당 Window가 위치할 x, y좌표를 설정하고 다섯번째는 변경할 Window의 가로크기, 여섯번째는 변경할 Window의 세로크기를 지정합니다.

마지막일곱번째 인수는 Window를 이동시킨뒤 표시할 Option을 지정하는 것으로 다음 상수를 사용합니다.

 상수  값  설명
 SWP_HIDEWINDOW  128  Window 숨김
 SWP_NOACTIVATE  10  Window 비활성화
 SWP_NOMOVE  2  x,y인수를 무시하고 현재위치 고수
 SWP_NOREDRAW  8  다시그리지 않음
 SWP_NOSIZE  1  c2, cy인수를 무시하고 현재크기 고수

16진수의 경우 VB.NET은 &H, C#은 0x를 붙여야 합니다.

위 상수들은 OR단위로 몇개의 Flag가 동시에 쓰일 수도 있습니다.

다음은 SetWindowPos함수를 사용한 예제입니다.

Private Const SWP_NOACTIVATE As Integer = &H10
SetWindowPos(Form2.Handle, -1, 100, 100, 500, 700, SWP_NOACTIVATE)
▶VB.NET 호출

private const int SWP_NOACTIVATE = 0x10;
SetWindowPos((int)Form2.Handle, -1, 100, 100, 500, 700, SWP_NOACTIVATE);
▶C# 호출

위 Program은 Form2 Window를 x100, y100위치에서 가로 500, 세로 700의 크기로 비활성화상태에서 Windows를 최상위로 이동시킵니다. 이때 Form2가 Focus를 가지지 않는다 하더라도 최상위 상태는 계속적으로 유지하도록 합니다.

SetWindowPos함수는 정상적으로 실행되면 1이 실패하는 경우에는 0이 반환됩니다.
0 0