#include <Windows.h>
#include <Psapi.h>
#include <iostream>
#pragma comment(lib, "psapi.lib")
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (GetParent(hwnd) == NULL && IsWindowVisible(hwnd))
{
char WindowText[100] = {0};
::GetWindowTextA(hwnd, WindowText, 100);
if (strlen(WindowText) != 0)
{
std::cout << WindowText <<std::endl;
char szClassName[100] = {0};
::GetClassNameA(hwnd, szClassName, 100);
cout<< szClassName <<endl;
DWORD dwPID = 0;
GetWindowThreadProcessId(hwnd, &dwPID);
cout<< "PID: "<<dwPID <<endl;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
cout<< "PHandle: "<<hProcess<< endl;
HMODULE hMod = NULL;
DWORD dwcbNeeded = 0;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &dwcbNeeded))
{
char szPath[MAX_PATH] = {0};
GetModuleFileNameA(hMod, szPath, MAX_PATH);
cout<< szPath << endl;
GetModuleFileNameExA(hProcess, hMod, szPath, MAX_PATH);
cout<< szPath<<std::endl <<endl;;
}
CloseHandle(hProcess);
}
}
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
EnumWindows(EnumWindowsProc, 0);
system("pause");
return 0;
}
另外上面的代码中在获取进程模块路径时用到的GetModuleFileNameA和GetModuleFileNameExA两个API获取路径不同, 第一个只能获取本进程的模块路径,包括主路径和dll路径(比如 kernel32.dll)。
第二个可以获取用OpenProcess打开的进程句柄的路径。
版权声明:本文为linfengmove原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。