句柄可以隐藏自己不被枚举吗?QQ自由幻想的窗口句柄为什么SPY++和任务管理器可以看到,却无法使用enumwindows获取,findwindow也无法获取!!!先前1.12版本之前都可以获取到的,升级到1.12就消失了
代码如下。function EnumWindowsProc(Hwnd: THandle; Param: LPARAM): Boolean; stdcall;
var chars:PAnsichar;
begin
  chars := strAlloc(100) ;
  try
    GetWindowText(hwnd, chars, 100); //别的都可以获取!就QQ自由幻想的句柄未看到!
    if AnsiContainsText(chars, 'QQ自由幻想') then     //'QQ自由幻想'
    begin
     //无法执行到这!!!
    end;
  finally
    StrDispose(chars);
  end;  Result:= true;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
 EnumWindows(@EnumWindowsProc, 0); //调用枚举
end;

解决方案 »

  1.   

    应该不会~`spy++也是用的这个函数
      

  2.   

    看你想要获得的是不是某一子窗体的二级子窗体我记得enumwindows是枚举一级子窗体
      

  3.   

    楼上大虾说的对,enumwindows是枚举一级窗体,findwindowex可以获取子窗体句柄,问题是,在SPY++中,QQ自由幻想的句柄就在Desktop的下一级,确实是一级窗体了。
      

  4.   

    应该不会吧~你用spy++的时候是不是点了显示所有多级子窗口了?如果点了的话当然可以全看到的
      

  5.   

    唉。真想贴个图给你看看。
    大哥,SPY++的等级我还是可以分清楚的。我可以确认它确实是一级窗口,#32769 (Desktop)是顶级窗口,它和“DV2ControlHost「开始」菜单” 是同级窗口。
      

  6.   

    那你就把所有窗口全部枚举出来对一级窗口再用enumwindows以前做软件汉化的时候自已写了一个工具就和spy+差不多
      

  7.   

    你意思是说把所有enumwindows的结果用enumchildwindows把子窗口也枚举出来?
      

  8.   

    可能是把消息屏蔽了
    这句是通过消息获得的,GetWindowText(hwnd,   chars,   100);   //别的都可以获取!就QQ自由幻想的句柄未看到! 以前的版本能获得是没有处理这类消息的拦截,现在好多软件都都做了类似的处理,以防非法.........
      

  9.   

    你为什么一定要GetWindowText?窗口名称这么重要?GetClassName看看能得到#32769否,换个思路,别钻在死胡同里!有了句柄了还一定要窗口名称?做什么用?
      

  10.   

    比如QQ2007的窗口没名称,GetClassName得到#32770,你看到的游戏窗口上的名称不一定能用GetWindowText获取,说不定它也没有名称,你却把没名称的窗口给屏蔽掉了!当然我没装你那游戏,也不好去验证。
      

  11.   

    会不会QQ幻想HOOK了枚举窗口的函数?楼主,解决了
      

  12.   

    谢谢楼上各位大哥,问题依然。 hook掉函数有可能,但据1楼大哥说spy++也用的是enumwindow,不知道为什么它可以我用这函数就不可以。现在的解决方法是拿spy++查出句柄手动输入。 
      

  13.   

    谢谢 sz100wwb  问题就在于我无法获取到它的句柄!  不是想得到窗口title, 句柄是我的最终目标!
      

  14.   

    jt了。大虾们有兴趣请加msn boythl#hotmail.com共同讨论。谢谢!