프로그래밍/델파이

[pascal] FindWindow / FindWindowEx

채윤아빠 2021. 4. 1. 23:08
728x90
반응형

FindWindow

윈도우 핸들 (HWND)을 구하기 위하여 FindWindow() 함수를 많이 이용하게 되는데, 이 함수의 원형은 다음과 같습니다.

function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;

주로 다음과 같은 형식으로 FindWindow() 함수를 이용합니다.

uses Windows;

var
    hwnd: THandle;
begin
    // 윈도우 이름으로 메모장 핸들 찾기
    hwnd := FindWindow(nil, '제목 없음 - Window 메모장');
    // 클래스 이름으로 메모장 핸들 찾기
    hwnd := FindWindow('Notepad', nil);
    // 여러 개의 메모장에서 특정 윈도우 이름의 메모장 찾기
    hwnd := FindWindow('Notepad', 'README.md - Window 메모장');
end;

FindWindow()함수를 이용할 때의 문제는 클래스 이름이 같거나, 윈도우 이름이 같은 윈도우가 여러 개일 경우에는 찾기가 애매하다는 것입니다.

FindWindowEx

FindWindowEx() 함수를 FindWindow() 함수보다 다음의 경우들에서 아주 유용하게 이용할 수 있습니다.

  • 특정 윈도우의 특정한 자식 윈도우 찾기
  • 경우에 따라서는 EnumWindow() 대체
  • 클래스 이름이 같거나, 윈도우 이름이 같은 윈도우에서 특정한 것 찾기에 응용

FindWindowEx() 함수의 원형은 다음과 같습니다.

function FindWindowEx(Parent, Child: HWND; ClassName, WindowName: PChar): HWND; stdcall;

다음은 동일한 대화상자들 중에서 특정한 "static" 텍스트를 갖는 대화상자를 찾는 예제입니다.

uses Windows;

var
  hwnd, hwndParent, hwndPrev, hwndStatic: THandle;
  strText: string;
begin
  Result := false;
  hwndParent := 0;
  hwndPrev := 0;

  while True do
  begin
    hwnd := FindWindowEx(hwndParent, hwndPrev, '#32770', nil);
    if (hwnd = 0) then
      break;

    hwndStatic := FindWindowEx(hwnd, 0, 'static', 'Target Static Name');
    if (hwndStatic > 0) then
    begin
      Result := True;
      break;
    end;
    hwndPrev := hwnd;
  end;

참고자료