我不想再做笨蛋了|

wenli7363

园龄:3年3个月粉丝:7关注:6

windows编程 根据进程名获取进程ID 以及该进程下所有窗口的句柄

Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄

这些函数都是比较常用的,所以我直接写个随笔记录一下,以后也可以直接copy

如果pe报错了,就在项目属性->属性配置->高级->字符集改为使用多字节字符集

//#include <windows.h>
#include <Windows.h>
#include <stdint.h>
//#include <tlhelp32.h>
#include <TlHelp32.h>
#include <stdio.h>
#include <iostream>
#include <vector>
typedef struct EnumHWndsArg
{
std::vector<HWND>* vecHWnds;
DWORD dwProcessId;
}EnumHWndsArg, * LPEnumHWndsArg;
HANDLE GetProcessHandleByID(int nID)//通过进程ID获取进程句柄
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}
DWORD GetProcessIDByName(const char* pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {
if (strcmp(pe.szExeFile, pName) == 0) {
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
//printf("%-6d %s\n", pe.th32ProcessID, pe.szExeFile);
}
CloseHandle(hSnapshot);
return 0;
}
BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
{
EnumHWndsArg* pArg = (LPEnumHWndsArg)lParam;
DWORD processId;
GetWindowThreadProcessId(hwnd, &processId);
if (processId == pArg->dwProcessId)
{
pArg->vecHWnds->push_back(hwnd);
//printf("%p\n", hwnd);
}
return TRUE;
}
void GetHWndsByProcessID(DWORD processID, std::vector<HWND>& vecHWnds)
{
EnumHWndsArg wi;
wi.dwProcessId = processID;
wi.vecHWnds = &vecHWnds;
EnumWindows(lpEnumFunc, (LPARAM)&wi);
}
int32_t main()
{
DWORD pid = GetProcessIDByName("WechatBrowser.exe");
printf("pid = %u\n", pid);
if (pid != 0)
{
std::vector<HWND> vecHWnds;
GetHWndsByProcessID(pid, vecHWnds);
printf("vecHWnds.size() = %u\n", vecHWnds.size());
for (const HWND& h : vecHWnds)
{
HWND parent = GetParent(h);
if (parent == NULL)
{
printf("%p --->Main Wnd\n", h);
}
else
{
printf("%p %p\n", h, parent);
}
}
}
getchar();
return S_OK;
}
posted @   wenli7363  阅读(1302)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起