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