通过进程名获取主框架窗口句柄

转自: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窗口,二级子窗口等等)。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值