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

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

Данный пример показывает, как создать программу наподобие 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;
}