win32通过进程名字取进程id,再取进程主窗口句柄
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2021-04-24 22:32:26
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
用到的头文件
#include <Windows.h> #include "tlhelp32.h"
通过进程名字取进程id
DWORD Active::getProcessId(LPCTSTR lpProcessName) { DWORD dwRet = 0; HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapShot == INVALID_HANDLE_VALUE) { _tprintf(_T("\n获得进程快照失败,返回的GetLastError():%d"), ::GetLastError()); return dwRet; } PROCESSENTRY32 pe32;//声明进程入口对象 pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 ::Process32First(hSnapShot, &pe32);//遍历进程列表 do { if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID { dwRet = pe32.th32ProcessID; break; } } while (::Process32Next(hSnapShot, &pe32)); ::CloseHandle(hSnapShot); return dwRet; }
通过进程id取窗口句柄
先定义一个窗口回调函数和窗口句柄结构体
///< 枚举窗口参数 typedef struct { HWND hwndWindow; // 窗口句柄 DWORD dwProcessID; // 进程ID }EnumWindowsArg; ///< 枚举窗口回调函数 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { EnumWindowsArg *pArg = (EnumWindowsArg *)lParam; DWORD dwProcessID = 0; // 通过窗口句柄取得进程ID ::GetWindowThreadProcessId(hwnd, &dwProcessID); if (dwProcessID == pArg->dwProcessID) { pArg->hwndWindow = hwnd; // 找到了返回FALSE return FALSE; } // 没找到,继续找,返回TRUE return TRUE; }
写一个函数来枚举窗口
HWND Active::GetWindowHwndByPID(DWORD dwProcessID) { HWND hwndRet = NULL; EnumWindowsArg ewa; ewa.dwProcessID = dwProcessID; ewa.hwndWindow = NULL; EnumWindows(EnumWindowsProc, (LPARAM)&ewa); if (ewa.hwndWindow) { hwndRet = ewa.hwndWindow; } return hwndRet; }