在我的程序中启动另外一个程序,如何让这个被启动的程序成为我程序的一个子窗体? 谁能圆满解决我再加100分! (10分)

L

lixx

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的程序中启动另外一个程序,如何让这个被启动的程序成为我程序的一个子窗体?
比如说:我写一个程序,启动计算机器程序(calc.exe),在启动之后这个计算器窗体就成为
我程序的子窗体,即移动范围在我程序客户区之内。
该怎么办?
 
用SetWindowLong试试
 
在我试之前,我想问问大家:有没有人见过类似的程序?
 
可以做到,但是比较复杂了,winexec可以设置窗口句柄,你试一下,平时我都是用nil的,
或者也可以自已编写hook了,类似的程序有:
有个凌波丽(日本卡通的小女孩)坐在你的窗口上,不管你怎么移窗口,想想看,是不是
实现的技术是一样的?
还有个程序,当你的鼠标移动到关闭按钮上时就在闪烁,
如果自已写,那考虑的东西就多了,不是一两条语句可以写完的。
总之,完全可以实现,只不过有点烦,不一定值得
 
你见过在IE里启动的WORD吗??

前提是WORD支持,因为它是COM。
 
我查了一下:winexec并不返回句柄啊?
我原来的想法是:
先用
winexec或shellexecute(ex)或createprocess,
然后用得到被启动程序的窗口句柄,然后调用Setparent改变那程序的父窗口,
可是没有成功。
渴望得到一个例子。
(我之所以要这么做,有原因的)
 
ShellExecute (0, nil, 'notepad',nil, nil, SW_SHOWNORMAL);
刚才错了,要用这个,研究一下吧,第一个参数就是父窗口的句柄
 
下面是关于这个参数的说明

hwnd
Window handle to a parent window.
This window receives any message boxes that an application produces.
For example, an application may report an error by producing a message box.

明显,调用Shellexecute的窗体并不会成为启动程序的父窗体。
而且我也试了,行不通的。
还 有没有其它什么办法?
 
获得窗口句柄也可以用findwindow 啊,通过窗口标题来找,不过如果你的程序是通用的,
就要研究一下了
 
>:沙隆巴斯的主人
那是OLE,而我想说的不是。
我就是想启动类似windows的计算器之类的程序(calc.exe)。
别的没有什么过份要求。
 
这种方法可以,我试过的

procedure TForm1.Button1Click(Sender: TObject);
var
h: THandle;
begin
h := FindWindow(nil,'计算器');
if h > 0 then
windows.SetParent(h, Handle)
else
ShowMessage('没有发现计算器!');
end;
 
来自:lixx, 时间:2002-11-7 17:47:00, ID:1419694
我查了一下:winexec并不返回句柄啊?
我原来的想法是:
先用
winexec或shellexecute(ex)或createprocess,
然后用得到被启动程序的窗口句柄,然后调用Setparent改变那程序的父窗口,
可是没有成功。
渴望得到一个例子。
(我之所以要这么做,有原因的)

你之所以没有成功,是因为你还没等到计算器的窗口显示出来,就调用了SetParent方法。
你要等到计算器窗口出来之后,才调用SetParent方法。
 
>lhzzj
按照你说的,我做了一下,似乎有点进展,但是在重画方面似乎有点问题
因为计算器(calc.exe)程序启动之后,界面就花了,有没有什么好的解决办法?
 
就算不回答,帮忙顶一下,也给分!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1347829看看去.
 
procedure TForm1.Button1Click(Sender: TObject);

var
SourceWnd:HWND ; //外部程序窗体句柄
DestinationWnd: HWND; //自己窗体句柄
r:TRECT; // 外部程序窗体大小
begin
WinExec('calc.exe',sw_HIDE);
SourceWnd := FindWindow(nil,'计算器');
DestinationWnd:=form1.handle;
GetWindowRect(SourceWnd,r);

if SourceWnd > 0 then
begin
windows.SetParent(SourceWnd, DestinationWnd);
movewindow(SourceWnd,0,0,r.Right-r.Left ,r.Bottom -r.Top,true);
showwindow(SourceWnd,sw_show);
end

else
ShowMessage('没有发现计算器!');

end;
 
多人接受答案了。
 
顶部