转自:http://my.csdn.net/tudou23115/code/detail/21236
#include "tchar.h"
#include <atlconv.h>
#include <TlHelp32.h>
#include <winnt.h>
//定义一个进程ID和窗口句柄的结构体
typedef struct tagWNDINFO
{
DWORD dwProcessId;
HWND hWnd;
} WNDINFO, *LPWNDINFO;
//枚举回调函数
BOOL CALLBACK EnumWindsProc(HWND hWnd,LPARAM lParam)
{
DWORD dwProcessId;
//通过窗口句柄获取进程ID
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
//匹配遍历窗口进程号与通过进程名得到的进程号
if(dwProcessId == pInfo->dwProcessId)
{
pInfo->hWnd = hWnd;//返回找到的窗口句柄
return FALSE;
}
return TRUE;
}
int GFindWindows(LPCTSTR proc_name,HWND *bufs, int buf_len)
{
int num=0;//返回的窗口句柄数目
DWORD dwPID = 0; //一个临时PID
int a[MAX_PATH];//存放进程PID的数组
DWORD Proc_num=0;//进程数量
//************************根据进程名称获取进程ID***********//
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return 0;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
{
if (!wcscmp(pe.szExeFile, proc_name))
{
a[Proc_num]= pe.th32ProcessID;
Proc_num++;
}
}
//进程数量为0 提示找不到进程 返回为0;
if (Proc_num==0)
{
bufs=NULL;
buf_len=0;
return 0;
}
else//找到一个匹配进程
{
//对一个进程名有多个相同进程ID的全部数组进行处理
for (int j=0;j<Proc_num;j++)
{
WNDINFO *wi=new WNDINFO;
wi->dwProcessId =a[j];//将获取到的进程ID传给结构体
wi->hWnd = NULL;
//遍历顶层窗口获取窗口句柄
EnumWindows(EnumWindsProc,(LPARAM)wi);
HWND re_hwnd = wi->hWnd;
while( GetParent(re_hwnd) != NULL )//循环查找父窗口,以便保证返回的句柄是最顶层的窗口句柄
{
re_hwnd = GetParent( re_hwnd );
}
//比较设定的大小与设计大小
if (num<buf_len)
{
//判断当前进程是否无窗口 无窗口句柄则不保存
if (wi->hWnd!=NULL)
{
bufs[num]=re_hwnd;
num++;
}
}
}//end for (int j=0;j<Proc_num;j++)
return num;//返回句柄个数
}
}
描述:通过进程名获取主框架窗口句柄,由于只知道某个程序的进程名,用FindWindow()也可以获取到窗口的句柄但是窗口的标题有可能是不是在发生变化,顾不可靠,还有一点就是,有可能一个进程没有窗口,也可能有多个窗口(包括子窗口,Dll窗口,二级子窗口等等)。