This is a console-mode program that shows a use of EnumWindows and some of the information that can be gotten using a windows handle. The EnumDesktopWindows
function can be used instead of EnumWindows.
This program can be compiled as-is by Visual C++ as a console program, except
the GetModuleFileNameEx function uses psapi, which works for Windows NT (and
2000) only. For more samples and an excellent description of related techniques,
see Microsoft KB article HOWTO: Enumerate Applications in Win32 (Q175030).
The output from this program is not especially pretty, but this is just a
sample use of the functions.
#define STRICT 1
#include <windows.h>
#include <psapi.h> // NT only!
#include <iostream>
using namespace std;
#pragma comment(lib, "psapi") // NT only!
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
DWORD dwThreadId, dwProcessId;
HINSTANCE hInstance;
char String[255];
HANDLE hProcess;
if (!hWnd)
return TRUE; // Not a window
if (!::IsWindowVisible(hWnd))
return TRUE; // Not visible
if (!SendMessage(hWnd, WM_GETTEXT, sizeof(String), (LPARAM)String))
return TRUE; // No window title
hInstance = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessId);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
cout << hWnd << ' ' << dwProcessId << '\t' << String << '\t';
// GetModuleFileNameEx uses psapi, which works for NT only!
if (GetModuleFileNameEx(hProcess, hInstance, String, sizeof(String)))
cout << String << endl;
else
cout << "(None)\n";
CloseHandle(hProcess);
return TRUE;
}
int main(int argc, char *argv[], char *envp[]) {
EnumWindows(EnumWindowsProc, NULL);
return 0;
}
References
C++ Q&A: Get the
Main Window, Get EXE Name
Using PSAPI