菜鸟瓶子 2022-01-07 16:27 采纳率: 0%
浏览 151
已结题

VS FindWindow()和EnumWindows()等方法获取其他进程的窗口句柄不一致

刚接触MFC没多久,碰到一个需求,去获取其他进程的窗口句柄,但是我用 FindWindow()和EnumWindows()等方法获取到的句柄不一致,希望各位帮忙解解惑。

以下是我获取句柄的三种方法
方法一


//通过进程名获取进程ID
DWORD GetPidByProcessName(TCHAR *pProcess) 
{ 
    HANDLE hSnapshot; 
    PROCESSENTRY32 lppe; 
    //创建系统快照 
    hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); //#include<Tlhelp32.h>
    if (hSnapshot == NULL) 
        return 0; 
    //初始化 lppe 的大小 
    lppe.dwSize = sizeof(lppe); 
    //查找第一个进程 
    if (!::Process32First(hSnapshot, &lppe))
        return false; 
    do 
    { 
        if(StrCmp(lppe.szExeFile, pProcess) == 0)
        { 
            return lppe.th32ProcessID;
        }   
    } 
    while (::Process32Next(hSnapshot, &lppe)); //查找下一个进程  
    return 1;
}

HWND GetHwndByPid(DWORD dwProcessID)
{
    //返回Z序顶部的窗口句柄
    HWND hWnd = ::GetTopWindow(0);

    while ( hWnd )
    {
        DWORD pid = 0;
        //根据窗口句柄获取进程ID
        DWORD dwTheardId = ::GetWindowThreadProcessId( hWnd,&pid);

        if (dwTheardId != 0)
        {
            if ( pid == dwProcessID )
            {
                flag=false;
                return hWnd;
            }
        }
        //返回z序中的前一个或后一个窗口的句柄
        hWnd = ::GetNextWindow(hWnd , GW_HWNDNEXT);

    }
    return NULL;
}

方法二:



typedef struct EnumFunArg
{    
    HWND      hWnd;
    DWORD    dwProcessId;    
}EnumFunArg,*LPEnumFunArg;
BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
{

    EnumFunArg  *pArg = (LPEnumFunArg)lParam;    
    DWORD  processId;
    GetWindowThreadProcessId(hwnd, &processId);    
    if( processId == pArg->dwProcessId)    
    {    
        pArg->hWnd = hwnd;
        return FALSE;    
    }
    return TRUE;    
}HWND ReturnWnd(DWORD processID)
{
    HWND retWnd=NULL;  
    EnumFunArg wi;  
    wi.dwProcessId   =processID;  
    wi.hWnd   =  NULL;  
    EnumWindows(lpEnumFunc,(LPARAM)&wi);
    if(wi.hWnd){     retWnd=wi.hWnd;
    }   return retWnd;
}

方法三:

hwnd3= ::FindWindow(NULL,_T("QuickWatch_V00.01"));

运行结果及报错内容 :

img

方法一和方法二获取到的句柄相同,但与方法三获取的不同。我用Spy++查看,方法三获取到的才是正确的句柄。

以下是方法三获取到的句柄的信息

img

以下是方法一和方法二获取到的句柄的信息

img

好像方法一和方法二获取到的是方法三获取到的窗口的子窗口,这是什么原因?希望各位来指点一下,十分感谢!!

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2022-01-10 10:47
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器