我的一个程序是获取另外一个程序的窗口句柄,我想请教一个问题就是:
如何只通过父窗口A句柄获取弹出窗口B的的句柄,窗口B可能是模态的也有可能是非模态的。
通过SPY++可以看到该弹出的窗口B的父句柄就是指向窗口A的。
我通过FindwindowEx用hwndChildAfter这个参数进行了遍历,无法遍历到弹出的窗口B,但是该窗口A下的子窗口都可以遍历出来,只要不是弹出的窗口。
然后我又用EnumChildWindows进行了一次遍历,发现还是没有遍历到窗口B。我不想使用如下办法:遍历桌面窗口下的所有子窗口然后再去比对他们的父窗口是否是A窗口
所以请教各位大侠,有没有好的快速的有效的解决办法,小弟我没招了

解决方案 »

  1.   

    用窗口标题来 Find 呢?
      

  2.   

    又见钻石了! 膜拜下.......钻石说的对.如果要是同程序,在创建弹出对话框的时候就把其句柄给sendmessage到父窗口
    不同程序,先把要接收消息的窗口句柄保留待用,创建子框时发消息
      

  3.   

    我觉得用窗口名来findwindows就很ok呀。。
      

  4.   

    试试采用findwindow("窗口类名","窗口名")进行查找
      

  5.   

    HWND hParent = 父窗口;
    FindWindowEx(hParent, NULL, _T("class"), _T("title"));仔细 类名和窗口标题。
      

  6.   

    基本上有两种可能,因为具有WS_POPUP窗口风格的窗口不能是WS_CHILD,所以它不能是主窗口的子窗口。因此它创建的时候父窗口有可能是主窗口也有可能是NULL(桌面),因此EnumChildWindows是不成立的。尝试使用GetWindow(HWND, GW_ENABLEDPOPUP);
      

  7.   

    或者再尝试EnumThreadWindows,EnumWindows两个API,应该都可以
      

  8.   

    有时候其他函数不顶用的时候,试试GetLastActivePopup()这个
      

  9.   


    这种方法是不行的,因为有时候可能没有父窗口,即父窗口=NULL(桌面)。
    HWND hWnd = CreateWindowEx(0, _T("MyClass"), _T("MyPopupWindow"), WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL/*parent*/, NULL, NULL, NULL);
    这是可以的。
      

  10.   

    FindWindowEx(hParent, NULL, NULL, _T("title"));
    这样应该是可行的,楼主Checked一下你使用FindWindowEx中的参数问题.
      

  11.   

    最近事多没上CSDN。。谢谢大家的回复
      

  12.   


    因为如果比较父窗口使用的时间可能就比较长,这个不符合我的要求。。如果能用父窗口比较我就不上CSDN问了不过还是要谢谢你的回答
      

  13.   

    找到方法了, 使用GetWindow(parent_hwnd, GW_ENABLEDPOPUP)可以获取弹出的子窗口的句柄