我曾想用OLE来实现但没有成功,请大家来讨论

解决方案 »

  1.   

    用CreateProcess,然后你就获得一个线程Handle。调用EnumThreadWindows,枚举所有Windows,在回调函数中改变窗口的位置SetWindowPos你也可以用FindwindowEx,然后SetWindowPos
      

  2.   

    用 CreateProcess参数很多,如果是固定Caption,可以用 FindWindow示例如下,将一个计算器放入Panel;  procedure set1( a, b: thandle);
      begin
        SetParent(a, b);
      end;
    procedure TForm1.PutCalcClick(Sender: TObject);
    var
       pos: tpoint;
    begin
       WinExec(PChar('C:\WINNT\System32\calc.exe'),SW_HIDE);
       a := findwindow('SciCalc', '计算器');
       Set1(a ,panel1.handle);
       pos.x := 0;
       pos.y := 0;
       Panel1.ClientToScreen(pos);
       SetWindowPos(a, HWND_TOP, pos.x, pos.x, panel1.Width, panel1.Height, SWP_SHOWWINDOW);
       ShowWindow(a, SW_SHOW);
    end;
      

  3.   

    qiubolecn:
    我用你的方法在调用winword时候不行啊,这种方法不太稳定
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      StartupInfo:TStartupInfo;
      ProcessInfo:TProcessInformation;
    begin
         // 初始化工作
         FillChar(StartupInfo,Sizeof(StartupInfo),#0);
         StartupInfo.cb := Sizeof(StartupInfo);     StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
         CreateProcess(nil,
            'Calc',                         // 运行计算器
            nil,
            nil,
            false,
            CREATE_NEW_CONSOLE or
            NORMAL_PRIORITY_CLASS,
            nil,
            nil,
            StartupInfo,
            ProcessInfo);
    end;