#include <windows.h> #include <TlHelp32.h> #include <atlstr.h> #include <locale.h> #define WINDOW_TEXT_LENGTH 256 BOOL CALLBACK EnumChildWindowCallBack(HWND hWnd, LPARAM lParam) { DWORD dwPid = 0; GetWindowThreadProcessId(hWnd, &dwPid); // 獲得找到視窗所屬的進程 if(dwPid == lParam) // 判斷是否是目標進程的視窗 { printf("0x%08X ", hWnd); // 輸出視窗資訊 TCHAR buf[WINDOW_TEXT_LENGTH]; SendMessage(hWnd, WM_GETTEXT, WINDOW_TEXT_LENGTH, (LPARAM)buf); wprintf(L"%s/n", buf); EnumChildWindows(hWnd, EnumChildWindowCallBack, lParam); // 遞迴尋找子視窗 } return TRUE; } BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam) { DWORD dwPid = 0; GetWindowThreadProcessId(hWnd, &dwPid); // 獲得找到視窗所屬的進程 if(dwPid == lParam) // 判斷是否是目標進程的視窗 { printf("0x%08X ", hWnd); // 輸出視窗資訊 TCHAR buf[WINDOW_TEXT_LENGTH]; SendMessage(hWnd, WM_GETTEXT, WINDOW_TEXT_LENGTH, (LPARAM)buf); wprintf(L"%s/n", buf); EnumChildWindows(hWnd, EnumChildWindowCallBack, lParam); // 繼續尋找子視窗 } return TRUE; } int main() { setlocale(LC_CTYPE, "chs"); DWORD qqPid = 0; // 進程id PROCESSENTRY32 pe; // 進程資訊 pe.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 進程快照 if(!Process32First(hSnapshot, &pe)) // 得到第一個進程的快照 return 0; do { if(!Process32Next(hSnapshot, &pe)) return 0; } while (StrCmp(pe.szExeFile, L"QQ.exe")); // 遍曆進程直到找打目標進程 qqPid = pe.th32ProcessID; wprintf(L"Find QQ.exe process: 0x%08X/n", qqPid); EnumWindows(EnumWindowCallBack, qqPid); return 0; }
1.擷取視窗內容的兩種方式:GetWindowTest(hWnd, szOut);SendMessage(hWnd, WM_GETTEXT, nLen, szOut);兩種方式對於進程內的操作來說是一樣的。但是跨進程操作時,前者只返回視窗的標題(有的視窗可能沒有標題),後者返回視窗文本。2.wprintf如果要輸出中文需要在程式入口添加setlocale(LC_CTYPE, "chs");3.EnumWindows只能枚舉最上層視窗,需要遞迴調用EnumChildWindows才能獲得進程的所有視窗。