윈도우의 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
'API' 카테고리의 다른 글
GetWindowThreadProcessId를 사용한 프로세스 강제 종료 (0) | 2011.10.07 |
---|---|
CopyMemory를 사용한 배열 정보 얻기 (0) | 2011.10.07 |
SetWindowsHookEx를 사용한 마우스 전역 훅 (0) | 2011.10.06 |
ODBC 레지스트리로 직접 설정 (0) | 2011.10.02 |
GetDIBits를 사용한 이미지 비교 (0) | 2011.10.01 |