Hallo,
Zuerst der Hintergrund.
ich habe mir ein Plugin-System gebaut, welches auf Basis normaler Exe-Files arbeitet.
Damit umgehe ich alle Probleme die
BPL und
dll bringen und mache mich von der Programmiersprache
unabhängig.
Ich kann so eine Exe modal oder nicht modal zum aufrufenden Programm ablaufen lassen und in die Mainform
des rufenden Programmes einbetten.
Beispiel:
In einem Projekt ist die gesamte Abrechnung für einen Kunden ein eigenes Projekt.
Beim Start übergebe ich die Kundennummer, arbeite das Programm modal zum aufrufenden Programm ab und bekomme
einen Return-Code zum Erfolg des Programmes zurück.
Beispiel:
Delphi-Quellcode:
TaskStrt := Task.Init(Self, Self,'Teilnehmerabrechnung.exe',false); // Das Steuerobjekt für den Task
result := AutPlugin.Task.Startmodal(Self,TaskStrt,'R' + RID);
freeandnil(TaskStrt);
if result = -1 then
Showmessage('Teilnehmer wurde nicht gefunden');
Innerhalb von AutPlugin.Task.Startmodal wartet die Routine auf das Ende des aufgerufenen Programms.
Delphi-Quellcode:
procedure WaitFor(processHandle: THandle);
var
Msg: TMsg;
ret: DWORD;
begin
repeat
ret := MsgWaitForMultipleObjects(1,
{ 1 handle to wait on }
processHandle,
False,
INFINITE,
QS_PAINT
or QS_SENDMESSAGE
);
if ret = WAIT_FAILED
then Exit;
if ret = (WAIT_OBJECT_0 + 1)
then
begin
while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE)
do
//<__ Hier müste die Abfrage erfolgen
DispatchMessage(Msg);
end;
until ret = WAIT_OBJECT_0;
end;
{ Waitfor }
Das funktioniert recht gut.
Neben dem rufenden Programm erscheint das gestartete Programm in der Taskleiste.
Hier habe ich jedoch einen kleinen unschönen Effekt.
Wechsele ich über die Taskleiste in ein beliebiges anderes Programm und dann zurück in
das gestartete Programm funktioniert alles wie gewollt.
Aktiviere ich über die Taskleiste jedoch das aufrufende Programm, dann kommt dieses in den Vordergrund und verdeckt das aufgerufene Programm.
Es verhält sich, als ob es abgestürzt wäre, da es ja modal auf ein anderes Programm wartet.
Ich habe noch keine Message gefunden, um im rufenden Programm zu erkennen, das es über die Taskleiste aktiviert wurde.
(Zumindest onactivate und onshow kommen nicht in den sichtbar werdenen Fenstern an.)
Kann mir wer auf die Sprünge helfen wie ich mitbekomme, ob ein Programm über die Taskleiste wieder in den Vordergrund geholt wird.
Das wäre die einfachste Lösung.
Alternativ könnte ich in der Taskleiste das aufrufende Programm verstecken.
Für einen Tip dankbar.
Gruß
Peter