help,关于SetParent的困或(120分)

  • 主题发起人 主题发起人 aizuodream
  • 开始时间 开始时间
A

aizuodream

Unregistered / Unconfirmed
GUEST, unregistred user!
我想通过windows.SetParent在一个delphi工程调用另一个exe文件,然后把它嵌入panel控件里,我已经成功实现了.但是,如何把那个exe文件的标题在任务栏里去掉呢?还有我在关掉那个主程序时,并不能同时关掉那个EXE文件,而且此时也找不到那个EXE文件的窗口了.请问如何才能同时关掉那个EXE文件呢?
 
对于第一个问题:
bw := Getsystemmetrics(SM_CXBORDER);//得到边框宽度
bh := Getsystemmetrics(SM_CYBORDER);//得到边框高度
ch := Getsystemmetrics(SM_CYCAPTION);//得到标题栏高度
sh := Getsystemmetrics(SM_CYSMCAPTION);//得到小标题栏高度
MoveWindow(xx, -2 * bw, -(2 * bh + ch), self.Panel1.Width + 4 * bw, self.Panel1.Height + 4 * bh + ch + sh, true);
SetWindowPos(xx, self.Panel1.Handle, 0, 0, self.Panel1.Width, self.Panel1.Height, SWP_NOZORDER and SWP_NOMOVE and SWP_NOSIZE);//这里的XX就是你要内嵌的哪个程序的句柄.
至于第二个问题.既然你知道了哪个程序的句柄,可以用消息.
const WM_QUIT:= $0012;
PostMessage(xx,WM_QUIT,nil,nil) ;
你可以查查这个函数的具体用法.我这个不一定对
 
SetWindowLong(frmDll.Handle,GWL_STYLE,GetWindowLong(frmDll.Handle,GWL_STYLE) and not (WS_CAPTION or WS_THICKFRAME));
windows.SetParent(frmDll.Handle,frmExe.panWorkSpace.Handle);
其中WS_CAPTION和WS_THICKFRAME分别表示标题栏和边框,问题解决.
Q:[Delphi]关闭外部程序又一方法
A:假设要关闭 notepad.exe 程序,代码如下:

uses tlhelp32;
procedure TForm1.Button1Click(Sender: TObject);
var
lppe:tprocessentry32;
sshandle:thandle;
hh:hwnd;
found:boolean;
begin
sshandle :=createtoolhelp32snapshot(TH32CS_SNAPALL,0);
found :=process32first(sshandle,lppe);
while found do
begin
if uppercase(extractfilename(lppe.szExeFile))=’NOTEPAD.EXE’ then //**
begin
hh:=OpenProcess(PROCESS_ALL_ACCESS,true,lppe.th32ProcessID);
TerminateProcess(hh,0);
end;
found:=process32next(sshandle,lppe);
end;
end;
-------------------------
Uses WinSvc
faq-it.org/delphi_vcl/ procedure RunService(ServiceName : String); //启动服务
procedure TASESWatch2002.RunService(ServiceName: String);
var
svcmgr,svc : Integer ;
temp : _SERVICE_STATUS;
s : Pchar ;

begin
svcmgr :=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if svcmgr = 0 then
exit ;
svc :=OpenService(svcmgr,pchar(ServiceName),SERVICE_ALL_ACCESS);
if svc = 0 then
begin
CloseServiceHandle(svcmgr);
exit ;
end ;
QueryServiceStatus(svc,temp);
if temp.dwCurrentState = SERVICE_STOPPED then
begin
if StartService(svc,0,s) then
//服务:"'+ServiceName+'"启动成功' else
//服务:"'+ServiceName+'"启动失败';
end ;// ControlService(svc,SERVICE_CONTROL_STOP,temp);关闭服务
CloseServiceHandle(svcmgr);
CloseServiceHandle(svc);
end;
up
-------------------------------
3. 关闭已开启的外部应用程序

⑴ 通过调用两个API函数,可以实现该功能。这两个函数分别为:

① FindWindow函数 该函数用于查找与指定的类名和窗口名相匹配的高层窗口,如果查找成功,返回非0值,否则返回0。

② SendMessage函数 此函数向一个或多个窗口发送指定的消息。在此通过发送WM_CLOSE消息来关闭指定的外部应用程序。

⑵ 通过编写标题为“关闭已开启的外部应用程序”组件的OnClick事件,来关闭已开启的外部应用程序。代码如下:

procedure TForm1.Button2Click(Sender: TObject);

var

hWndClose: HWnd; file://存储指定的外部应用程序窗口句柄

str: String; file://存储指定的外部应用程序的窗口名

begin

str := InputBox('提示','请输入应用程序名:',''); file://获取要关闭的应用程序窗口名

if str <> '' then begin

file://根据窗口名查找要关闭的窗口句柄

hWndClose := FindWindow(nil, PChar(str));

if hWndClose <> 0 then file://如果查找成功,则发送消息,关闭指定的窗口

SendMessage(hWndClose,WM_CLOSE,0,0);

else file://否则,给出提示信息

ShowMessage('没找到指定的应用程序,所以无法关闭!');

end;

end;
 
感谢楼上两位的解答.不过,你们可能并没有理解我提出的问题.
我来补充一下:
假设我现在有两个可执行文件,一个名叫program1.exe,另一个叫program2.exe
我先运行program1.exe,大家知道,一般我们运行一个程序,在桌面最下面的任务栏会出现程序的标题;我现在要在program1.exe中用WinExec调用program2.exe,在program2.exe中,我用windows.setparent把program1.exe捆绑到一个pannel组件里.即在program2的pannel里显示program1表单的内容.
我现在的问题,是在运行program1之后,想把它在桌面下任务栏里那个标题去掉(注意,不是program1里窗体的标题栏),因为Program1被program2捆绑之后,在任务栏里出现了两个程序的标题,我现在只想出现一个,就是program2的.
然后,我再来说一个现像,就是假设program2已经把program1捆绑之后,如果你现在把program2关掉之后,并不能自动关掉它所嵌套的program1,即在任务栏里,program1标题依然存在,但是你现在却找不到它的窗口了!!!如果你现在用findwindow来找program1的窗口也找不到了.
总结:我想解决的两个问题,1:去掉windows任务栏里program1的标题
2.关闭program2时,自动关闭program1,不用向它发送关闭信息

help..........
 
后退
顶部