목차 열기

티스토리 뷰

728x90
반응형

VBA WinAPI / user32 - FindWindow & FindWindowEx

이 글은 Excel VBA 코딩 중, Windows API 함수를 사용하는 과정을 기록하기 위한 것이므로 이 점 참고 바랍니다.


이 포스팅은 Excel VBA에서 Win API를 사용하는 것에 대해 다룹니다.

user32 - FindWindow & FindWindowEx

목표로 하는 프로그램의 윈도우 핸들을 찾는 데에 쓰입니다. 프로그램의 창 이름("제목 없음 - Windows 메모장")이나 클래스 이름으로 찾습니다. 클래스 이름은 VBA WinAPI Wondows Detective 등의 프로그램으로 알 수 있습니다.

Microsoft technical documentation

FindWindow (FindWindowA)

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowa

FindWindowEx (FindWindowExA)

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowexa

함수 선언

코드 상단에 추가해서 사용합니다.

#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
                                                                (ByVal lpClassName As String, _
                                                                ByVal lpWindowName As String) As Long
    Private Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
                                                                (ByVal hwndParent As Long, _
                                                                ByVal hwndChildAfter As Long, _
                                                                ByVal lpszClass As String, _
                                                                ByVal lpszWindow As String) As Long
#Else
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
                                                                (ByVal lpClassName As String, _
                                                                ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
                                                                (ByVal hwndParent As Long, _
                                                                ByVal hwndChildAfter As Long, _
                                                                ByVal lpszClass As String, _
                                                                ByVal lpszWindow As String) As Long
#End If

설명 및 예제

FindWindow

  • 클래스이름이나 창이름에 해당하는 최상위 윈도우 핸들을 반환합니다.
  • 자식 윈도우를 찾지 않습니다.
  • 대소문자를 구분하지 않습니다.
  • 각 인자에 NULL을 입력할 수 있습니다.
  • 함수가 실패하면 NULL을 반환합니다.
Function FindWindow(
    ByVal lpClassName As String,  '클래스이름
    ByVal lpWindowName As String  '창이름
    ) As Long


    '핸들 반환
    Debug.Print FindWindow(vbNullString, vbNullString) '66280


    '클래스이름이 "Notepad"인 윈도우핸들
    Debug.Print FindWindow("Notepad", vbNullString) '723584


    '창이름이 "제목 없음 - Windows 메모장"인 윈도우핸들
    Debug.Print FindWindow(vbNullString, "제목 없음 - Windows 메모장") '723584


    '클래스이름이 "Notepad"이고, 창이름이 "제목 없음 - Windows 메모장"인 윈도우핸들
    Debug.Print FindWindow("Notepad", "제목 없음 - Windows 메모장") '723584

FindWindowEx

  • 클래스이름이나 창이름에 해당하는 윈도우 핸들을 반환합니다.
  • 지정된 창에서부터 자식 윈도우를 찾습니다.
  • 대소문자를 구분하지 않습니다.
  • 각 인자에 NULL을 입력할 수 있습니다.
  • 함수가 실패하면 NULL을 반환합니다.
Function FindWindowEx(
    ByVal hwndParent As Long,      '자식핸들이 검색될 부모핸들
    ByVal hwndChildAfter As Long,  '자식핸들 다음부터 검색이 시작. 현재핸들 입력하면 바로 다음 핸들 반환
    ByVal lpszClass As String,     '클래스이름
    ByVal lpszWindow As String     '창이름
    ) As Long


    '모든 윈도우핸들 순차적으로 검색
    Dim hwnd As Long
    hwnd = FindWindowEx(0, 0, vbNullString, vbNullString)
    While hwnd <> 0
        hwnd = FindWindowEx(0, hwnd, vbNullString, vbNullString)
    Wend


    '자식->자식->자식 윈도우을 순차적으로 검색
    Dim hWndChild1, hWndChild2, hWndChild3 As Long
    hWndChild1 = FindWindowEx(hWnd, 0, vbNullString, "Main")
    hWndChild2 = FindWindowEx(hWndChild1, 0, vbNullString, "Tab")
    hWndChild3 = FindWindowEx(hWndChild2, 0, vbNullString, "Sub")

INDEX

VBA / INDEX

VBA / WinAPI / INDEX

728x90
반응형

'VBA > WinAPI' 카테고리의 다른 글

VBA WinAPI / INDEX  (1) 2022.08.28
VBA WinAPI / user32 - SetForegroundWindow  (0) 2022.08.28
VBA WinAPI / user32 - ShowWindowAsync  (0) 2022.08.28
VBA WinAPI / user32 - GetWindowText  (0) 2022.08.27
VBA WinAPI / user32 - GetClassName  (0) 2022.08.27
VBA WinAPI / Windows API Viewer for MS Excel  (0) 2022.08.25
VBA WinAPI / Windows Detective  (0) 2022.08.25
댓글
글 보관함
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Total
Today
Yesterday