본문 바로가기

Programming Tips/MFC

MFC에서 현재 실행 중인 응용프로그램 목록 얻어오기

 음...프로그래밍을 하다보면 아래 그림과 같은 작업 관리자의 응용 프로그램 탭
에 나오는 현재 실행 중인 응용 프로그램의 목록이 필요한 날이 있겠지요??
저는 있습디다...ㅎㅎ
이리저리 돌아다니면서 찾아본 결과 EnumWindows라는 함수를 사용하니까 쉽게
해결이 되더군요.

사용자 삽입 이미지

EnumWindows라는 함수는 윈도우 운영체제 상의 모든 윈도우 목록을 조사해서
콜백함수로 넘겨줍니다. 콜백함수로 넘겨지는 데이터는 윈도우의 핸들이 되겠구
요. 콜백함수에서는 넘겨받은 핸들을 이용하여 윈도우 핸들로 가능한 모든 작업
을 할 수 있습니다. 말하자면, 윈도우의 캡션이라든가 Rect 좌표 같은 정보를 알
아내거나 해당 윈도우로 메시지를 보낸다든지 하는 그런 것들 말이죠.

MSDN에서 따온 함수원형은 아래와 같습니다.

BOOL EnumWindows(
  WNDENUMPROC
lpEnumFunc// pointer to callback function
  LPARAM lParam            // application-defined value
);

lpEnumFunc 이라는 놈은 보시다시피 콜백함수의 포인터라는군요.
다음으로 lParam 라는 놈이 나오는데요 다들 알고 계시겠죠??

자 그럼 실제로 EnumWindows라는 함수를 한 번 써보겠습니다.

먼저 함수의 첫번째 파라미터로 넘겨줄 콜백함수를 만들어야겠지요?
저는 EnumWindowCallBack이라는 이름으로 만들었습니다.

BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam);

함수의 내부는 다음과 같이 만들었습니다.

BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam)
{
 char Cap[255];
 RECT rt;
 CString HwndInfo;
 int length;

 GetWindowText(hwnd, Cap, 255);
 length = GetWindowTextLength(hwnd);
 GetWindowRect(hwnd, &rt);
 
 if (IsWindowVisible(hwnd) && length > 0)
 {
  HwndInfo.Format("%s", Cap, rt.left, rt.top, rt.right, rt.bottom);
  pDlg->m_comboControl.AddString(HwndInfo);
  pDlg->OpenWindow[pDlg->count] = hwnd;
 }
 return TRUE;
}

EnumWindows 함수로부터 hwnd라는 윈도우의 핸들을 가지고 놀아봅시다.
GetWindowText 함수를 이용해서 해당 윈도우의 캡션을 Cap이라는 배열에
저장하고 캡션의 길이를 length에 저장합니다. Rect를 얻어오는건 제가 필요
해서 한거구요...없어도 실행 중인 응용 프로그램 목록을 얻어오는데는 문제
가 없습니다. 위의 소스에서는 if문을 이용해서 작업관리자의 목록만을 가져
오지만 혹시나 모든 윈도우의 핸들이 필요하시다면 if문을 살짝 지우면 다 가
져 올 수 있겠지요...ㅎㅎ
IsWindowVisible 함수를 이용해서 윈도우의 WS_VISIBLE 속성이 On이면서
캡션의 길이가 0보다 큰 녀석들만 가져옵니다.
pDlg는 다이얼로그의 포인터이구요 컨트롤형 변수로 선언된 콤보박스에 CString
으로 선언된 HwndInfo를 AddString으로 넘겨주면 아래의 그림과 같이 작업
관리자와 똑같은 목록을 얻어 올 수가 있답니다...

사용자 삽입 이미지


작으나마 도움이 되었기를...^^;

아래 첨부파일은 간단한 예제입니다.