Перечисление всех открытых окон в системе.

Данный пример показывает, как создать программу наподобие Spy++. Для этого нам понадобятся следующие API функции:
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam); - перечисляет все окна в системе: lpEnumFunc – адрес функции: BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam); lParam – число которое передается в функцию.
int GetWindowText(HWND hWnd, LPTSTR lpString, int nMaxCount); - получение заголовка окна: hWnd – хэндл окна; lpString – буфер, куда будет помещен заголовок; nMaxCount – максимальная длина буфера.
int GetClassName(HWND hWnd, LPTSTR lpClassName, int nMaxCount ); - получение имени класса окна: hWnd - хэндл окна; lpClassName – строка куда будет помещено имя класса; nMaxCount - максимальная длина имени.
DWORD GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId); - возвращает идентификатор потока, создавшего окно; hWnd – хэндл окна; lpdwProcessId – сюда возвращает идентификатор процесса, создавшего окно.
Теперь запускай VC++, создавай проект Win32 Console Application и напиши следующее:
#include <windows.h>
#include <iostream>
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
int main()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY);
cout<<"Code by Lazy_elf"<<endl;
if(EnumWindows(&EnumWindowsProc,NULL))
{
cout<<"EnumWindows - ok"<<endl;
}else{cout<<"Error EnumWindows..."<<endl;}
return 0;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char szTextWin[255];DWORD dwPID = NULL;
if(GetWindowText(hwnd,szTextWin,sizeof(szTextWin)))
{
CharToOem(szTextWin,szTextWin);
cout<<szTextWin<<" --- CLASS: ";
szTextWin[0] = '\0';
if(GetClassName(hwnd,szTextWin,sizeof(szTextWin)))
{
cout<<szTextWin<<" - TID: "<<GetWindowThreadProcessId(hwnd,&dwPID);
cout<<" - PID:"<<dwPID<<endl;
}
}
else
{
cout<<"no text"<<" --- CLASS: ";
szTextWin[0] = '\0';
if(GetClassName(hwnd,szTextWin,sizeof(szTextWin)))
{
cout<<szTextWin<<" - TID: "<<GetWindowThreadProcessId(hwnd,&dwPID);
cout<<" - PID:"<<dwPID<<endl;
}
}
szTextWin[0] = '\0';
return TRUE;
}