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;
}