실행 중인 응용프로그램 목록을 가져오고 싶을 땐, EnumWindows
함수를 사용하면 된다.
BOOL EnumWindows(
[in] WNDENUMPROC lpEnumFunc, // 사용자 정의 함수
[in] LPARAM lParams // 사용자 정의 함수에 보낼 인자
)
EnumWindows
는 정의한 callback 함수 lpEnumFunc
가 TRUE를 반환하면,
그 다음 HWND(Handle Windows)를 가져오는 방식이다.
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam) {
return TRUE;
}
EnumWindows(EnumWindowsProc, (LPARAM)NULL);
EnumWIndows
는 백그라운드 프로세스까지 검색하는데,
만약, 실제로 보고있는 프로세스 목록만 검색하고 싶을 경우 아래의 코드를 추가해주면 된다.
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam) {
BOOL isVisible = IsWindowVisible(hwnd);
if (!isVisible) {
return TRUE;
}
return TRUE;
}
EnumWindows(EnumWindowsProc, (LPARAM)NULL);
응용 프로그램명에 영어 뿐만 아니라 다른 언어가 들어올 수 있으므로
1 byte를 가지는 char
대신 2 byte를 가지는 wchar_t
를 사용해야 한다.
#include <Windows.h>
#include <string>
#include <iostream>
#define MAX_STR_LENGTH 1024
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam) {
int length = GetWindowTextLength(hwnd);
BOOL isVisible = IsWindowVisible(hwnd);
if (!isVisible || length == 0) {
return TRUE;
}
wchar_t windowTitle[MAX_STR_LENGTH];
GetWindowTextW(hwnd, windowTitle, MAX_STR_LENGTH);
std::wstring title(&windowTitle[0]);
std::cout << hwnd << " ";
std::wcout << windowTitle;
std::cout << "\n";
return TRUE;
}
int main() {
std::wcout.imbue(std::locale("korean"));
EnumWindows(EnumWindowsProc, NULL);
return 0;
}
wchar_t 타입을 출력하고자 할 경우, cout이 아닌 wcout을 사용해줘야 한다.
그리고 wstring은 한글을 위한 자료형이 아니기 때문에 cout.imbue(locale("korean"))
을 통해 따로 명시해줘야 한다.