# 윈도우 찾기
함수로 윈도우의 핸들을 구하기만 하면 해당 윈도우를 마음대로 요리 할 수 있다.
HWND FindWindow(LPCSTR lpClassName,LPCTSTR lpWindowName)
윈도우의 핸들을 조사하는 함수, 이 함수는 최상위 윈도우중에 조건에 맞는 윈도우를 검색하는데
윈도우 클래스 이름이나 캡션을 조건으로 지정한다. lpClassName에 윈도우 클래스 이름을 전달하며,
lpWindowName에 캡션을 전달하되 둘 중 하나만 지정 할 수도 있다. 이때 대소문자는 구분하지 않는다.
만약 둘 다 지정할 경우는 윈도우 클래스만으로 검색하며 캡션은 무시된다. 조건에 맞는 윈도우를 찾으면
그 핸들을 리턴하며 찾지 못할 경우 NULL을 리턴한다.
HWND FindWindowEx(HWND hWndParent,HWND hWndChildAfter,LPCSTR lpszClass,LPCSTR lpszWindow)
이 함수는 hWndParent 윈도우에 속한 차일드 윈도우를 검색해내며 이 인수가 NULL일 경우 데스크탑 윈도우
의 차일드를 검색한다. hWndChildAfter 인수는 검색을 시작할 차일드 윈도우를 지정하는데 이 차일드의 Z순서
다음 차일드 부터 검색된다. 연속적인 검색을 위해 시작 윈도우는 검색 대상에서 제외하는 것이 편리하다.
HWND WindowFromPoint(POINT Point)
이 함수는 Point 화면 좌표 아래에 있는 윈도우를 조사해서 그 핸들을 리턴한다.
단, 숨겨진 윈도우나 사용금지된 윈도우는 검색 대상에서 제외되며 Point 위치에 스태틱 컨트롤이 있는 경우
그 아래의 윈도우가 조사된다.
HWND ChildWindowFromPoint(HWND hWndParent,POINT point)
HWND ChildWindowFromPoint(HWND hWndParent,POINT pt,UINT uFlags)
이 함수의 Point 좌표는 hWndParent 부모 윈도우의 작업 영역의 좌표이다. Point가 작업 영역의 범위를 벗어나
면 이 함수는 NULL을 리턴하며 차일드 윈도우 위가 아니라면 부모 윈도우 자신의 핸들을 리턴한다. 이 함수는
숨겨진 윈도우와 사용금지된 윈도우까지도 검색해 내는데 ~Ex 함수는 uFlags에 검색 제외 조건을 지정할 수 있다.
윈도우 핸들,캡션,클래스,부모윈도우,작업영역 얻기 예)
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
POINT pt;
HWND hWndPoint, hWndParent;
static HWND hWndOld;
static TCHAR str[256];
TCHAR sCaption[256], sClass[256];
RECT crt;
switch (iMessage) {
case WM_CREATE:
SetTimer(hWnd,1,500,NULL);
return0;
case WM_TIMER:
GetCursorPos(&pt);
hWndPoint=WindowFromPoint(pt);
if (hWndPoint == hWndOld)
return0;
hWndOld=hWndPoint;
if (hWndPoint == NULL) {
lstrcpy(str,TEXT("윈도우 없음"));
} else {
GetWindowText(hWndPoint,sCaption,256);
GetClassName(hWndPoint,sClass,256);
hWndParent=GetParent(hWndPoint);
GetWindowRect(hWndPoint,&crt);
wsprintf(str,TEXT("핸들 : %d(0x%x)\r\n클래스 : %s\r\n캡션 : %s\r\n")
TEXT("Parent : %d(0x%x)\r\n")
TEXT("Rect : (%d,%d) - (%d,%d), %d*%d"),
hWndPoint,hWndPoint,sClass,sCaption,hWndParent,hWndParent,crt.left, crt.top, crt.right,
crt.bottom, crt.right-crt.left, rt.bottom-crt.top);
}
InvalidateRect(hWnd,NULL,TRUE);
return0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
GetClientRect(hWnd,&crt);
DrawText(hdc,str,-1,&crt,0);
EndPaint(hWnd, &ps);
return0;
case WM_DESTROY:
PostQuitMessage(0);
return0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
비쥬얼 스튜디오가 제공하는 spy툴의 창찾기와 같은 기능을 가지는 프로그램이다.
마우스 커서가 가리키는 지점을 0.5초 단위로 갱신하며 커서의 좌표값으로 현재 커서의 좌표가 가리키는
지점의 윈도우의 핸들을 얻고 클래스, 캡션명, 부모윈도우, 사이즈 등을 표기한다.
# 윈도우 열거
BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam)
이 함수는 현재 실행중인 모든 최상위 윈도우들을 열거하여 첫 번째 인수로 지정된 콜백함수를 호출한다.
lParam은 콜백함수로 전달된 사용자 정의 데이터인데 필요없을 경우 NULL로 지정한다.
콜백함수의 원형은 다음과 같다.
BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)
EnumWindows 함수는 모든 최상위 윈도우를 검색해서 그 핸들을 콜백함수로 전달하되 모든 윈도우를
다 찾거나 콜백함수가 FALSE를 리턴할 때까지 검색을 계속한다. 콜백함수는 검색된 윈도우의 핸들을
전달 받으므로 모든 윈도우에 대해 모든 작업을 다 할 수 있다. 원하는 윈도우를 찾기 위해 캡션 문자열을
부분 검색할 수도 있고 좌표를 비교하거나 스타일을 조사하는 것도 가능하다.
간단한 사용예)EnumWindows(MyEnumWindowsProc,NULL);
BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc,LPARAM lParam)
BOOL CALLBACK MyEnumWindowsProc(HWND hWnd,LPARAM lParam)
{
TCHAR str[300];
TCHAR Cap[255];
RECT rt;
GetWindowText(hWnd,Cap,255);
GetWindowRect(hWnd,&rt);
wsprintf(str,TEXT("핸들=0x%x(%d), 캡션=%s, 좌표=(%d,%d,%d%d)"),hWnd,hWnd,Cap,rt.left,rt.top,
rt.right,rt.bottom);
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)str);
returnTRUE;
}
BOOL EnumThreadWindows(DWORD dwThreadId,WNDENUMPROC lpfn,LPARAM lParam)
위 함수는 특정 부모 윈도우의 차일드만 검색해 내거나 스레드에 속한 윈도우의 목록을 조사하는 함수다.
'프로그래밍 > API' 카테고리의 다른 글
API :: 윈도우 관리(5) 윈도우 리전,반투명,애니메이션 (0) | 2010.05.27 |
---|---|
API :: 윈도우 관리(4) 윈도우 관련 메시지 (0) | 2010.05.23 |
API :: 윈도우 관리(2) 작업영역,상태조사 및 변경,Z순서 (0) | 2010.05.23 |
API :: 윈도우 관리(1) 소유관계,위치,크기,좌표 (0) | 2010.05.22 |
Win32 ApiStart source. (0) | 2010.05.13 |