如何在MDI窗口中运行其他外部程序?外部程序的界面必须在MDI窗口中,即使最大化也不能超过MDI窗口的大小。我在网上找了很久都没有找到,麻烦各位帮帮忙,谢谢。

解决方案 »

  1.   

    学习,是否可以设置程序窗口的父窗口句柄为MDI窗口!
      

  2.   

    procedure TForm1.Button3Click(Sender: TObject);
    var
      ExeHandle:Thandle;
    begin
      ShellExecute(handle,'open','notepad.exe',nil,nil,SW_HIDE);
      Sleep(500);
      ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄
      Windows.SetParent(ExeHandle, Self.Handle);
      ShowWindow(ExeHandle, SW_MAXIMIZE)
    end;
    看看这个对你有帮助没有!
      

  3.   

    要uses   ShellAPI单元!
      

  4.   

    在Delphi 6 + WinXP下通过的!
      

  5.   

    to g961681(Cashier):你提供的方法我试了,可以通过,不过这里面我碰到一个问题,就是如果只是打开NOTEPAD的话,没有任何问题,但是如果是打开其他外部程序,比如说QQ的话,问题就出来了,QQ不像NOTEPAD一样是在MDI窗口中,而是还在外部,请问这样该如何解决呢?谢谢。
      

  6.   

    我就简单的修改了一下procedure TForm1.Button3Click(Sender: TObject);
    var
      ExeHandle:Thandle;
    begin
      ShellExecute(handle,'open','D:\tencent\qq.exe',nil,nil,SW_HIDE);//修改
      Sleep(500);
      ExeHandle:=FindWindow('qq',nil);//'');//返回句柄//修改
      Windows.SetParent(ExeHandle, Self.Handle);
      ShowWindow(ExeHandle, SW_MAXIMIZE)
    end;我就改了一下这些,可是没有我想的效果,我想要的是QQ这个程序只运行在MDI的子窗口里。
      

  7.   

    就是啊,你根本没找到qq真正的handle!
      

  8.   

    QQ的窗口 被 特殊制作的 因为它为了 防止 密码框被 钩子 捕获
    现在 的QQ登录密码框 已经无法用 钩子 获得了 除非你有 内容 汇编 获取数据的水平所以 它的 句柄很难 获得 你会发现它的 类名是#32770 而它的 窗口文本却是 一堆带回车的空格
    你 很难捕获的!所以我们要联合研究 QQ的强大 它做的很 狡猾!不过 它已经被人研究出来了 如 “QQ群发器” 它肯定要能正确找到 QQ窗口的句柄
    才能实现 群发,厉害哦!