我用类似的代码, 倒时实现了嵌入, 但是原来的EXE收不到焦点, 不能操作了.
哪位朋友请指点下?测试环境: Win7 + D7 
procedure TForm1.btn_ExecClick(Sender: TObject);
begin
     WinExec('MyEXE.exe',SW_SHOW);
end;procedure TForm1.btn_SetParentClick(Sender: TObject);
var
     iHD       : THandle;
begin
     iHD  := FindWindow(nil,'Form_ExeTest');
     if iHD>0 then begin
          Windows.SetParent(iHD,Handle);
      end;
end;

解决方案 »

  1.   

    在主程序里建一个Parent容器,看能不能满足你的要求var
    iHD:THandle;
    begin
    iHD:=FindWindow(nil,'form1');
    if iHD>0 then
    begin
    Windows.SetParent(iHD,pnl1.Handle);
    end;
    end;
      

  2.   

    D7+xpSp3是可以操作没有问题啊
    var
      iHD: THandle;
    begin
      iHD := FindWindow(nil, 'form1');
      if iHD > 0 then
      begin
        Windows.SetParent(iHD, Handle);
      end;
    end;
      

  3.   

    嗯,windows 能把别的进程的窗口随便嵌入自己的应用窗口 的功能,的确是比较奇怪
    反过来,也能把自己应用的窗口(包括按钮)随便嵌入别人的应用,前年的360劫持QQ就是这么做的
      

  4.   

    谢谢! 我看了很多资料, 也是这样用的, 为什么Win7下就不可以, 有人用Win7下试过吗?
      

  5.   

    直接调用系统自带的计算器等就没有问题, 不知道为什么?
    后面我又用VC做了一个EXE, 嵌入后也是没反应,汗!
      

  6.   

    后来采用一个办法, 在子窗体中setparent, 而不是在主窗体中调用,基本解决!
      

  7.   


    Application.Handle := iHD;
      

  8.   


    不知道是不是你要的效果,直接调用了DLL的窗体了。var
      DLLHandle: THandle;
      DLLSub: InvokeDLLForm;begin
      DLLHandle := LoadLibrary('prjDLL.dll');
      if DLLHandle <> 0 then
      begin
        @DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
        if Assigned(DLLSub) then
        begin
          DLLForm := DLLSub(Application, Screen);
        end;
      end;
    end;
      

  9.   

    有没有Win7下的? 感觉是不是操作系统的问题?
      

  10.   

    我要的是直接调用EXE, 前两天测试发现, 和Win7的AERO效果有关系,关闭了就可以,好像是什么层次的问题,有没有朋友帮助看看
      

  11.   

    的确和win7的aero有点关系。 
      

  12.   

    win7下没试过 留个脚印 备用
      

  13.   

    问题还要自己解决! 在子窗体中设置ParentWindow(好像是这个)就可以了
      

  14.   

    编程代码在操作系统执行时,如涉及到硬件读写或创建模块(控件)时,常常会出现滞后现象。win7比XP,更加严重,上述情况,就是如此。刚刚我试过了,在创建模块代码后,加上sleep,就能解决问题。试试.......
      

  15.   

    针对WIN7的的滞后情况,办法是有的。
    1、提高EXE的启动执行速度。将装载数据等代码,放在show之后执行。
    2、在FindWindow(nil,'Form_ExeTest')代码之前加入sleep(600);
      

  16.   

    又发现一个新问题, 采用ParentWindow:=容器窗体句柄后,不能收到WM_COPYDATA消息了,汗!