본문 바로가기

Programming/Win32&MFC&COM

프로세스 목록 확인하기(작업 관리자)

반응형

작업 관리자는 현재 실행 중인 프로세스의 목록을 보여줍니다.

작업 관리자와 유사한 형태로 현재 실행 중인 윈도우 목록을 보여주는 방법은 다음과 같습니다.

군더더기 코드를 없애기 위해서 콘솔 프로젝트로 작성합니다.

창의 타이틀, 파일명, PID 정도를 추출해서 출력하겠습니다.

이것은 일단 EnumWindows()라는 API함수를 이용해서 가능합니다.

이 함수는 현재 실행되는 윈도우들의 핸들값을 전부 하나씩 첫번째 인자인 함수에 보내줍니다.

그리고 실제 처리는 EnumWindowsProc(이름은 바꿔도 됨)에서 해주게 됩니다.

#include <windows.h>
#include <iostream>
#include <process.h>
#include <tlhelp32.h>

using namespace std;

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	wchar_t szTitle[2048] = {0, };
	DWORD dwPID = 0;

	PROCESSENTRY32 pEntry;
	memset(&pEntry, 0x00, sizeof(PROCESSENTRY32));
	pEntry.dwSize = sizeof(pEntry);
	
	// process list(like taskmgr)
	DWORD exStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
	BOOL isVisible = IsWindowVisible(hwnd);
	BOOL isToolWindow = (exStyle & WS_EX_TOOLWINDOW);
	BOOL isAppWindow = (exStyle & WS_EX_APPWINDOW);
	BOOL isOwned = GetWindow(hwnd, GW_OWNER) ? TRUE : FALSE;

	if (!(isVisible && (isAppWindow || (!isToolWindow && !isOwned))))
		return TRUE;

	GetWindowText(hwnd, szTitle, 2048); // get caption
	GetWindowThreadProcessId(hwnd, &dwPID);

	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dwPID);
	Process32First(hSnapShot, &pEntry);

	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPID);

	while (!(dwPID == pEntry.th32ProcessID) && IsWindowVisible(hwnd))
	{
		if (FALSE == Process32Next(hSnapShot, &pEntry))
			break;

		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPID);
	}

	wchar_t szRes[2048] = {0, };
	_stprintf_s(szRes, 2048, L"PID : 0x%08x, Title : %s, Filename : %s\n", dwPID, szTitle, pEntry.szExeFile);
	wcout << szRes;

	return TRUE;
}
void main()
{
	setlocale(LC_ALL, ""); // for wcout

	EnumWindows(EnumWindowsProc, NULL);
}

실행하면 다음과 같이 확인이 가능합니다.

PID 등이 정상적으로 출력되는 것을 확인할 수 있습니다.

잘 응용하면 작업 관리자와 유사하게 표시할 수 있습니다.

반응형