SetWindowPos는 윈도우를 크기,위치,Z-위치(3차원 위치)를 지정할 수 있다.

윈도우의 Z위치, 2차원적인 위치, 크기를 설정한다.
● 선언
Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

인수
hwnd ━ 위치 변경시킬 윈도우 핸들
hWndInsertAfterIMG SRC="_image\_Option.gif"> ━ Z 순서, 즉 윈도우의 앞뒤 상태를 지정한다. 윈도우 핸들을 지정해면, Z위치가 지정된 윈도우 핸들의 윈도우 뒤에 위치하게 된다.
x ━ 윈도우 왼쪽 상단 x축 위치
y ━ 윈도우 왼쪽 상단 y축 위치
cx ━ 윈도우의 폭
cy ━ 윈도우의 높이
wFlags ━ 크기나 위치를 어떤식으로 변경할지 나타내는 플래그

반환
성공 ━ 0이 아닌 값
실패 ━ 0

상수
hWndInsertAfter 사용, Z 순서(윈도우 앞뒤 순서)를 나타낸다.
상수 설명
HWND_BOTTOM 1 최하위
HWND_TOP 0 상위
HWND_NOTOPMOST -2 최상위가 아님
HWND_TOPMOST -1 최상위

wFlags 사용, 크기나 위치지 변경 플래그, or로 연결 가능

상수 설명
SWP_DRAWFRAME SWP_FRAMECHANGED
SWP_FRAMECHANGED &H20 새로운 윈도우(프레임) 스타일 적용을 알리도록 한다. WM_NCCALCSIZE 메시지를 강제적으로 보낸다
SWP_HIDEWINDOW &H80 윈도우를 보이지 않게 한다
SWP_NOACTIVATE &H10 윈도우를 활성화 시키지 않는다
SWP_NOCOPYBITS &H100 클라이언트 영역의 모든 요소를 무시
SWP_NOMOVE &H2 위치를 변경시키지 않는다.
SWP_NOOWNERZORDER &H200 윈도우의 Z위치를 변경하지 않는다
SWP_NOREDRAW &H8 윈도우를 새로 그리지 않는다
SWP_NOREPOSITION SWP_NOOWNERZORDER
SWP_NOSENDCHANGING &H400 WM_WINDOWPOSCHANGING 메시지를 받지 않도록 한다
SWP_NOSIZE &H1 크기를 변경시키지 않는다
SWP_NOZORDER &H4 Z 순서를 유지한다.
SWP_SHOWWINDOW &H40 윈도우를 보이게 한다

다음은 소스의 이미지이다.

상위의 옵션 버튼이 선택된 상태에서 마우스 왼쪽 버튼을 누르게 되면 현재 마우가 위치한 윈도우는 항상 최상위 윈도우가 된다
하위 옵션 버튼이 선택된 상태에서 마우스 왼쪽 버튼을 누르게 되면 현재 마우스가 위치한 윈도우는 Z-위치기 변화되는 일반 윈도우가 된다

다음은 소스이다.
' 폼 소스
' 최상위 윈도우
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.

Private Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long ' 훅체인에 훅프로시저를 선두에 끼워넣는다, 성공하면 훅프로시저의 핸들을 복귀한다.
Private Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long ' 훅체인에서 훅 핸들이 나타내는 훅 프로시저를 제거한다.
Private Const WH_MOUSE_LL = 14

Private hhkLowLevelMouse As Long  ' 훅 설치가 완료되는경우, 그 훅을 나타내는 핸들

Private Sub Form_Load()
    TopWindow = 0
    optTopWindow(TopWindow).Value = True
    hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, App.hInstance, 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If hhkLowLevelMouse = 0 Then Exit Sub
    UnhookWindowsHookEx hhkLowLevelMouse ' 훅을 체인에서 훅 제거한다.
    hhkLowLevelMouse = 0
End Sub

Private Sub optTopWindow_Click(Index As Integer)
    TopWindow = Index
End Sub

' 모듈 소스
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.

Public TopWindow As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) ' 메모리 내용을 복사한다.
Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long ' 훅체인에서 다음 훅프로시저를 호출한다.
Private Declare Function WindowFromPoint Lib "USER32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SetWindowPos Lib "USER32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetParent Lib "USER32" (ByVal hWnd As Long) As Long
Private Const HC_ACTION = 0
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const WM_LBUTTONDOWN = &H201

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Type MSLLHOOKSTRUCT
    pt          As POINTAPI
    mouseData   As Long
    flags       As Long
    time        As Long
    dwExtraInfo As Long
End Type

Private p As MSLLHOOKSTRUCT

Public Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim Windowhwnd As Long ' 마우스 위치의 윈도우 핸들
    Dim CheckParenthwnd As Long ' 부모 윈도우를 찾기 위함
    Dim MousePoint As POINTAPI ' 마우스의 위치
   
    If (nCode = HC_ACTION) And wParam = WM_LBUTTONDOWN Then
        CopyMemory p, ByVal lParam, Len(p)
        Windowhwnd = WindowFromPoint(p.pt.X, p.pt.Y)
        CheckParenthwnd = Windowhwnd
        While Not CheckParenthwnd = 0
            Windowhwnd = CheckParenthwnd
            CheckParenthwnd = GetParent(Windowhwnd)
        Wend
        SetWindowPos Windowhwnd, IIf(TopWindow = 0, HWND_TOPMOST, HWND_NOTOPMOST), 0&, 0&, 0&, 0&, SWP_NOMOVE Or SWP_NOSIZE
    End If
    LowLevelMouseProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End Function

+ Recent posts