CAFE

[6.0]Tip & Tech [인기]

[6.0]① SetWindowPos, FindWindow를 이용한 창 항상 위 만들기

작성자SmiLe|작성시간09.01.30|조회수2,900 목록 댓글 3

저도 여기서 많이 배운 만큼 저도 다른분에게 도움을 드리고 싶어서 올려봅니다..

저도 잘 알지는 못하니 틀린것이 있으면 지적해주세요~!

 

또한 중복이면 바로 삭제하겠습니다..(그냥 항상위 만드는 소스만 적혀있는 다른글있다고

중복이라고 삭제하라고 하는 것은 사양입니다..)

 

제가 말하려는 것은

아무 창이나 항상위로 만들거나 혹은 항상위 해제를 시키는 방법입니다.

 

우선 코드 젤 위에 아래 소스 2개를 추가 시킵니다.

----------------------------------------------------------------------

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)

Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2

Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1

 

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String _
) As Long

----------------------------------------------------------------------

첫번째는 항상위 옵션, 창움직임, 크기조정등을 할수있는 코드이구요

밑에 2번째는 창을 찾는 코드입니다..

 

setwindowpos의 경우 항상위로 많이 써진다고 하는데 크기조정이나 위치설정에도 많이 쓰입니다.

사용방법은

 

Call SetWindowPos(만들 창(핸들 값, 혹은 폼을 할때는 폼명.hwnd), 줄 속성, 위치 x값,위치 y값, 크기 x값, 크기 y값, 기타 속성)

입니다.

 

첫번째 핸들값은 좀있다 findwindow함수로 찾아주면 되구요 두번째 속성은 항상위로 해주시려면 HWND_TOPMOST를,

항상위를 해제하시려면 HWND_NOTOPMOST를 적어주시면 됩니다. 그다음 4개의 값은 알아서 하고 싶으신대로 적어주시면 되구요.. 그다음 기타속성.. 여러가지가 있습니다만 SWP_NOMOVE을 적어주시면 위치 xy값을 설정해주셔도 움직이지 않고 SWP_NOSIZE는 크기가 변하지 않습니다..

 

한마디로 항상위 시키시려면

Call SetWindowPos(창, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)

항상위 해제는

Call SetWindowPos(창, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)

해주시면 됩니다.

 

그다음 findwindow는요

FindWindow "클래스명", "창이름" 이렇게 씁니다.

하지만 찾아서 나온 값을 저장해야 하기 때문에

함수 = FindWindow ("클래스명", "창이름") 이렇게 많이 쓰지요..

클래스명은 비베 도구들(시작메뉴) 에 들어있는 spy++을 통해 알수있구요

(미니스파이를 비베로 만들기 올릴 생각입니다.)

창이름의 위에 우리가 보이는 이름입니다. 비베 폼에서는 캡션값이 될수 있구요...

 

이제 본론으로 들어가서

창을 항상위로 만들어 버리기 위해서 우선

text박스 하나와 커맨드 버튼 2개를 만들어 주세요

그리고 함수를 아무거나 2개 선언해 주시고요

저는 hwnd와 winnm 으로 하겠습니다.

(위에 저 코드는 이미 입력해 놓으셨겠죠..? 그 바로 밑에 선언해 주시면 됩니다.)

Dim winhwnd As Long

Dim winnm As String

 

그리고 첫번째 커맨드 버튼, 항상위를 만들 버튼에다가 아래처럼 적어주세요

----------------------------------------------------------------------

Private Sub 항상위 만들 버튼_Click()
 winnm = Text1.Text  ' 텍스트에 입력된것을 winnm에 받습니다.
 
winhwnd = FindWindow(vbNullString, winnm) ' 텍스트에 입력된 창이름을 찾아 핸들값(일종의 고유번호, 킬때마다 바뀝니다) 을 찾아 winhwnd에 저장합니다

 

If winhwnd <> 0 Then ' 만약 winhwnd의 핸들값이 있으면, 즉 찯을 찾았으면
Call SetWindowPos(winhwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) ' 항상위로 만듭니다
MsgBox "성공!"
Else
MsgBox "실패!"
End If

End Sub

----------------------------------------------------------------------

자 이렇게 하시면 텍스트 박스에 적은 창 이름을 찾아 항상위로 만들어 줍니다.

실험으로 내컴퓨터 창 하나 띄워놓고 내문서 하나 띄워놓고

text에다가 내 문서 하고 쳐 놓고 만들어 보세요..ㅎㅎ

 

항상위 해제는 위와 같은 코드에서 HWND_TOPMOST이부분을 HWND_NOTOPMOST으로 바꿔주시면 됩니다.

 

저기서 클래스명 대신 vbNullString을 적은것은 이 값을 무시하란 의미인데

클래스명을 알기위해선 spy++으로 클래스명을 따로 알아내야 하기때문에 값을 무시 시켜버린 것 입니다.

 

위에 소스들을 모두 종합해서 적어놓으면

 

----------------------------------------------------------------------

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)

Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2

Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1


Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String _
) As Long


Dim winhwnd As Long
Dim winnm As String

 

 

Private Sub 항상위 만들 버튼_Click()
 winnm = Text1.Text 
 
winhwnd = FindWindow(vbNullString, winnm)

 

If winhwnd <> 0 Then
Call SetWindowPos(winhwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
MsgBox "성공!"
Else
MsgBox "실패!"
End If

End Sub

 

Private Sub 항상위 취소 시킬 버튼_Click()
 winnm = Text1.Text 
 
winhwnd = FindWindow(vbNullString, winnm)

 

If winhwnd <> 0 Then
Call SetWindowPos(winhwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
MsgBox "성공!"
Else
MsgBox "실패!"
End If

End Sub

----------------------------------------------------------------------

 

자 이렇게 모두 끝났구요..

위치 이동이나 크기를 변경하시면 뒤에 SWP_NOMOVE이나 SWP_NOSIZE을 빼신 후

맞는 위치에 0대신 다른 값을 넣어두면 됩니다.

 

또한 참고로 HWND_TOPMOST 대신 -1

HWND_NOTOPMOST 대신 -2

SWP_NOMOVE 대신 &H2

SWP_NOSIZE 대신 &H1

를 입력하셔도 됩니다.(젤 위에 setwindowpos 코드 에 보시면 이유를 알수 있으실 겁니다.)

 

Private Const HWND_TOPMOST = -1

이런 코드를 통해 HWND_TOPMOST 는 -1이다 라는 값을 입력해 놓은 것이니까요.. ㅎㅎ

 

아 그리고 적어놓긴 했지만 잘 못찾으실까 적어 봅니다

비베 내의 폼은 폼이름.hwnd 를 winhwnd 대신 적어주시면 됩니다.

 

다음에 또 다른 글로 만나뵙겠습니다.

제덕분에 도움을 받는 분이 계시기를 바라며...

(도움받았으면 감사합니다 댓글 적어주시는 센스!)

틀린점이 있으시면 빠른 지적 부탁드립니다.. ㅎㅎ

 

이때까지 저의 서투른 글을 봐 주셔서 감사합니다

 

끝~~

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자진모씨 | 작성시간 09.02.03 감사합니다. 참고로 BringWindowToTop api가 이 강좌에 없는게 아쉽네요...
  • 답댓글 작성자김승호 작성자 본인 여부 작성자 | 작성시간 09.02.03 제가 써봤는데 안되더라구요 그래서 안했어요
  • 작성자Sky Jenny Smile | 작성시간 09.02.08 간단하고 좋네요.
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼