Mahlzeit,
ich versuche ein Programm per ShellExecute in ein anderes Programm einzubinden.
Dabei darf diese Anwendung immer nur 1x gestartet werden.
Wenn man versucht die Anwendung ein 2. mal zu starten soll die 1. Instanz in den Vordergrund geholt werden.
Ich habe also im Quelltext der aufzurufenden Anwendung folgenden Code hinterlegt. Der Aufruf und das Unterbinden von Mehrfachstarts funktionieren, aber die Anwendung wird nur beim 1. Versuch in den Vordergrund geholt...
Ich vermute das "BringWindowToTop" der falsche Befehl ist, aber "ShowWindow" bringt auch nicht den Erwünschten Erfolg (Es wird nur ein kleines Blaues Fenster über der Taskleiste angezeigt). Was anderes habe ich in den anderen Threads nicht gefunden... Sieht Jemand was ich falsch mache?
Delphi-Quellcode:
{$R *.res}
const
MutexName = 'ErweiterteListen';
var
hMutex: THandle;
NextHandle: Hwnd;
foundedHandle : Hwnd;
NextTitle: array[0..260] of char;
foundHandle : Boolean;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TListStatSchnittForm, ListStatSchnittForm);
foundHandle := false;
hMutex := CreateMutex(NIL, True, MutexName);
if (hMutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
begin
//Ab hier wird die schon gestartete Anwendung gesucht
CloseHandle(hMutex);
begin
NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
while (NextHandle > 0) and (foundHandle = false) do
begin
GetWindowText(NextHandle, NextTitle, 255);
if (Pos(ListStatSchnittForm.Caption, StrPas(NextTitle)) <> 0)
and (NextHandle <> application.Handle)
and (NextHandle <> ListStatSchnittForm.Handle) then
begin
foundedHandle := NextHandle;
foundHandle := true;
end
else
NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
end;
end;
if foundHandle then
begin
BringWindowToTop(foundedHandle);
//ShowWindow(foundedHandle, SW_SHOW);
halt;
end
end;
Application.Run;
end.