如何将其它程序嵌入自己程序的窗体中~如能实现追加500!

跪求!~楼主jaspcloud(jaspcloud)2004-10-18 19:44:49 在 Delphi / 非技术区 提问

跪求!~请问如何将其它程序嵌入自己程序的窗体中~如能实现最加500!  
   
  例如程序启动后,在个GroupBox控件中显示一个外部程序,最好能改变外部程序的尺寸(如去掉标题栏),当移动自己程序的窗体时,外部程序跟着移动  
   
  好像听说可以用findwindow找到窗口handle后,windows.setparent为自己的窗口,movewindows到自己的窗口  
   
  不懂!!!!!  
   
  跪求大家赐教啊,也可把简单实例源码发给我:   jaspcloud@126.com   或   jaspcloud@163.com  
   
  ~如能实现追加500!  
  ~如能实现追加500!  
 
问题点数:100、回复次数:13
Top

1 楼longtusoft(神灯之主)
回复于 2004-10-18 20:18:58 得分 7

等于把别人程序给"包装"一下是吧.好像该程序必须支持OLE才可以.
Top
2 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net
回复于 2004-10-18 23:15:21 得分 7

对方不支持OLE的根本就没可能做到  
   
  http://lysoft.7u7.net
Top
3 楼bat800(竹林)
回复于 2004-10-18 23:39:17 得分 2

路过,UP
Top
4 楼shxng(重新开始。。。)
回复于 2004-10-19 01:01:13 得分 2

等我懂了再来
Top
5 楼jaspcloud(jaspcloud)
回复于 2004-10-19 08:20:09 得分 0

to   :   longtusoft(神灯之主)/ly_liuyang(Liu   Yang)   谢谢!  
   
  对方不支持OLE的不能实现嵌入,那能否只改变外部程序的显示位置、尺寸呢  
  (外部程序不必加入资源文件)  
   
  跪求大家赐教啊,也可把简单实例源码发给我:   jaspcloud@126.com   或   jaspcloud@163.com  
   
  ~如能实现追加500!  
  ~如能实现追加500!  
   
 
Top
6 楼mikespook(优快云 == 吹死大牛)
回复于 2004-10-19 08:42:14 得分 30

procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      h:   HWND;  
  begin  
      h   :=   WIndows.FindWindow(nil,   '计算器');  
      Windows.SetParent(h,   Self.Panel1.Handle);  
      Windows.MoveWindow(h,   0,   0,   200,   200,   true);  
  end;  
   
  这样即可,你开个计算器,再执行~~~
Top
7 楼guolvguolv(盲鹰)
回复于 2004-10-19 08:56:33 得分 0

我给你一个,你看有没有用,我试过,基本和你的要求一个样  
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   ExtCtrls;  
   
  type  
      PProcessWindow   =   ^TProcessWindow;  
      TProcessWindow   =   record  
          TargetProcessID:   Cardinal;  
          FoundWindow:   hWnd;  
      end;  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          OpenD:   TOpenDialog;  
          Panel1:   TPanel;  
          procedure   Button1Click(Sender:   TObject);  
          procedure   FormClose(Sender:   TObject;   var   Action:   TCloseAction);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
      hWin:   HWND   =   0;  
  implementation  
   
  {$R   *.dfm}  
   
  function   EnumWindowsProc(Wnd:   hWnd;   ProcWndInfo:   PProcessWindow):   BOOL;   stdcall;  
  var  
      WndProcessID:   Cardinal;  
  begin  
      GetWindowThreadProcessId(Wnd,   @WndProcessID);  
      if   WndProcessID   =   ProcWndInfo^.TargetProcessID   then   begin  
          ProcWndInfo^.FoundWindow   :=   Wnd;  
          Result   :=   False;   //   This   tells   EnumWindows   to   stop   enumerating   since   we've   already   found   a   window.  
      end   else   Result   :=   True;   //   Keep   searching  
  end;  
   
  function   GetProcessWindow(TargetProcessID:   Cardinal):   hWnd;  
  var  
      ProcWndInfo:   TProcessWindow;  
  begin  
      ProcWndInfo.TargetProcessID   :=   TargetProcessID;  
      ProcWndInfo.FoundWindow   :=   0;  
      EnumWindows(@EnumWindowsProc,   Integer(@ProcWndInfo));  
      Result   :=   ProcWndInfo.FoundWindow;  
  end;  
   
  function   RunAppInPanel(const   AppName:   string;   PanelHandle:   HWND):   boolean;  
  var  
      si:   STARTUPINFO;  
      pi:   TProcessInformation;  
  begin  
      FillChar(si,   SizeOf(si),   0);  
      si.cb   :=   SizeOf(si);  
      si.wShowWindow   :=   SW_SHOW;  
      result   :=   CreateProcess(nil,   PChar(AppName),   nil,  
          nil,   true,   CREATE_NEW_CONSOLE   or   NORMAL_PRIORITY_CLASS,   nil,   nil,   si,   pi);  
   
      if   not   result   then   exit;  
   
      WaitForInputIdle(pi.hProcess,   10000);   //   let   process   start!  
   
      hWin   :=   GetProcessWindow(pi.dwProcessID);  
      if   hWin   >   0   then   begin  
          Windows.SetParent(hWin,   PanelHandle);  
          SetWindowPos(hWin,   0,   0,   0,   0,   0,   SWP_NOSIZE   or   SWP_NOZORDER);  
          result   :=   true;  
      end;  
   
      //   we   don't   need   the   handles   so   we   close   them  
      CloseHandle(pi.hProcess);  
      CloseHandle(pi.hThread);  
  end;  
  procedure   Delay(msecs:integer);  
   
  var  
  FirstTickCount:longint;  
   
  begin  
   
  FirstTickCount:=GetTickCount;  
  repeat  
  Application.ProcessMessages;  
  until   ((GetTickCount-FirstTickCount)   >=   Longint(msecs));  
   
  end;  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      delay(4000);  
      if   OpenD.Execute   then   begin  
          if   hWin   >   0   then   PostMessage(hWin,   WM_CLOSE,   0,   0);   //   close   any   app   currently   opened  
          if   not   RunAppInPanel(OpenD.FileName,   Panel1.Handle)   then   ShowMessage('App   not   found');  
      end;  
  end;  
   
   
  procedure   TForm1.FormClose(Sender:   TObject;   var   Action:   TCloseAction);  
  begin  
      if   hWin   >   0   then  
          PostMessage(hWin,   WM_CLOSE,   0,   0);  
  end;  
   
  end.  
   
 
Top
8 楼BigAngell(学而不思则罔 思而不学则殆)
回复于 2004-10-19 09:13:27 得分 0

guolvguolv(guolvguolv)   :  
   
  你写的程序是干什么用的呀,一点反应都没有呀!
Top
9 楼guolvguolv(盲鹰)
回复于 2004-10-19 09:28:07 得分 50

有呀,我给你的邮箱发一个完整的例子吧,我到别的地方down的
Top
10 楼ghchen()
回复于 2004-10-19 09:30:43 得分 2

不会,帮顶
Top
11 楼mikespook(优快云 == 吹死大牛)
回复于 2004-10-19 10:57:25 得分 0

guolvguolv(guolvguolv)   不要乱贴程序好不好?我用三行完成的功能,你贴了那么一大堆,还一点用都没有。
Top
12 楼jaspcloud(jaspcloud)
回复于 2004-10-19 14:07:39 得分 0

很好很好,!严重!感谢大家,特别感谢   mikespook(懒猫开始新生活)/guolvguolv(guolvguolv)  
  两位的代码都能实现!初步满足我的想法!  
   
  to   :   mikespook(懒猫开始新生活)    
            简洁的三行便实现了外部程序的嵌入,强(我菜:-))!  
            有点不足就是不能动态获取外部程序的类名:  
            即WIndows.FindWindow(nil,   '计算器')中的'nil'.  
            最加得分~200  
   
  to   :   guolvguolv(guolvguolv)  
            感谢你发来的代码包!  
            由于程序能在运行后,嵌入随便选择的外部程序,证明实现了以上说所的功能.  
            最加得分~300  
   
  我重新发贴,请两位尽快来拿分,以免被删!(刷新一下或查找我的贴)  
   
  拿分处:  
  mikespook(懒猫开始新生活):    
      http://community.youkuaiyun.com/Expert/TopicView.asp?id=3469964  
      http://community.youkuaiyun.com/Expert/TopicView.asp?id=3469969  
  guolvguolv(guolvguolv):  
      http://community.youkuaiyun.com/Expert/TopicView.asp?id=3469974  
      http://community.youkuaiyun.com/Expert/TopicView.asp?id=3469978  
      http://community.youkuaiyun.com/Expert/TopicView.asp?id=3469982  
   
  不好意思,本来想每人加500的,100一个贴的话我绝对被封IP了.以后再提问的时候请两位再来捧个场,绝对高分奉上!  
              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值