如果 Main 和 Sub 都是你自己写的,那就很简单,你让 Sub 退出的时候给 Main 的一个窗口发个消息就行。 如果 Main 是自己写的,而 Sub 不是自己写的,那么就上边的做法 如果 Main 不是自己写的而 Sub 是自己写的,那么就 Sub 退出的时候先FindWindow找出 Main 的主窗口给发个 WM_CLOSE 消息过去
SUB.exe程序中: 一、调用Main.EXE时,记下它的句柄。 ExeHandle:=findWindow(nil,'窗口名称'); // 返回EXE句柄 or shellexecute(exehandle,'open',pchar('main.exe'),'',nil,sw_shownormal);二、退出时,关闭该句柄的线程。 if ExeHandle<>0 then begin SendMessage(EXEHandle,WM_Close,0,0); // 向EXE发送关闭消息 ExeHandle:=0; end;
如果都是DELPHI写的有种很简单的办法,直接写一个回调函数(callback)1.MainForm编写一个 procedure MainForm.CallBackClose(Sender:TOBject); begin try Self.Free except end; end; 2.subForm加入回调代码 增加回调函数类型 type TCallBackClose:procedure (Sender:TOBject) of object; .... var CallBackMain:TCallBackClose; .... 在SubForm关闭的事件中加入 CallBackMain(SELF); 3.MainForm启动SUBFORM的时候记下HANDLE 4.通过HANDLE找到SUBFORM 5.将MainForm的CallBackClose传递给SUBFORM TForm(subFormHWND).CallBackMain:=CallBackClose;这样,就不需要线程、不需要消息、不需要TIMER去监听了,只要SUBFORM CLOSE或是你想要关闭MainForm的时候,执行CallBackMain(SELF) MAINFORM就CLOSE
如果 Main 是自己写的,而 Sub 不是自己写的,那么就上边的做法
如果 Main 不是自己写的而 Sub 是自己写的,那么就 Sub 退出的时候先FindWindow找出 Main 的主窗口给发个 WM_CLOSE 消息过去
一、调用Main.EXE时,记下它的句柄。
ExeHandle:=findWindow(nil,'窗口名称'); // 返回EXE句柄
or
shellexecute(exehandle,'open',pchar('main.exe'),'',nil,sw_shownormal);二、退出时,关闭该句柄的线程。
if ExeHandle<>0 then
begin
SendMessage(EXEHandle,WM_Close,0,0); // 向EXE发送关闭消息
ExeHandle:=0;
end;
procedure MainForm.CallBackClose(Sender:TOBject);
begin
try
Self.Free
except
end;
end;
2.subForm加入回调代码
增加回调函数类型
type
TCallBackClose:procedure (Sender:TOBject) of object;
....
var
CallBackMain:TCallBackClose;
....
在SubForm关闭的事件中加入
CallBackMain(SELF);
3.MainForm启动SUBFORM的时候记下HANDLE
4.通过HANDLE找到SUBFORM
5.将MainForm的CallBackClose传递给SUBFORM
TForm(subFormHWND).CallBackMain:=CallBackClose;这样,就不需要线程、不需要消息、不需要TIMER去监听了,只要SUBFORM CLOSE或是你想要关闭MainForm的时候,执行CallBackMain(SELF) MAINFORM就CLOSE