我用ShellExecute打开了一个外部程序,该程序像Winamp一样有多个窗体,请问我怎么样才能找到其中某一个窗体的操作句柄,并且将键盘的输入焦点始终定在这个窗体上?
最好能提供一个示例程序,能说清楚大概过程就行,问题解决立即给分,请大家帮帮忙,谢谢!!!

解决方案 »

  1.   

    function FindWin():Cardinal;
    var
      hHwnd : Cardinal;
    begin
      hHwnd:=FindWindow(nil,'Player');
      if hhwnd=0 then
        hHwnd := FindWindow(nil,'InterVideo WinDVD 5');
      if hhwnd=0 then begin
        Result := 0;
        exit;
      end else
        Result := hHwnd;
    end;
      

  2.   

    我用findwindow试过,可是窗体的标题是'当前打开的文件名'+'程序名称',打开不同的文件,窗体标题也不相同,这该怎么处理?用窗体的类吗?该怎么找到窗体的类呢?还有就是怎么将键盘的输入焦点强行限制在我指定的窗体上呢,用setfocus好像不行!!
      

  3.   

    我用ShellExecute打开外部程序之后,在findwindow中无论是用窗体类还是窗体的标题,我都无法获得窗体的句柄,返回值总是零,难道是我的方法不对吗?
      

  4.   

    我在findwindow返回值为0的时候也调用getlasterror函数查看出错消息,结果是函数执行成功,是不是用findwindow根本就不可能找到呢,有没有什么其他方法可以找到呀?拜托,大家帮帮忙吧!!
      

  5.   

    ShellExecute以后略微停顿下比如用sleep再使用findwindow,程序运行也要时间,可能还没初始化完成
      

  6.   

    你用spy++看看你这个窗口信息先,看看标题、句柄、类型等等
      

  7.   

    如果知道窗口的类名,通过FindWindow函数就可以获得窗口的句柄。你返回值一直不对的话一定是调用不对,类名不对。
    可以用GetWindow函数来枚举窗口,用Findwindow函数来查找制定的窗口
      

  8.   

    这个窗体的类名让我非常困惑,他是“Afx:400000:b:10011:6:xxxxxxx”,其中xxxxxxx每次打开都不同,我以前没有见过这样的类名,不知道谁可以告诉我这究竟是什么类名呀
      

  9.   

    问题解决了,我用枚举的方式把窗体找出来了,用的是EnumWindow函数。结贴!!!!谢谢大家帮忙!!