Hallo,
mal wieder ein Problemchen und finde dazu leider keine Lösung.
Sitze gerade an einem kleinen Tool weches wenn es gestartet wird eine Übersicht anzeigt.
Wird das Programm mit Parameter /OPEN gestartet soll ein kleines Fenster aufgehen in welches man einen Namen Eintragen kann. Es soll in einer Datenbank speichern wie lange jemand telefoniert hat.
Es funktioniert ohne Parameter schon einmal sehr gut. Wird das Programm gestartet und es existiert bereits eine Instanz, so wird diese in den Vordergrung geholt.
Als
Mutex hierfür verwende ich ExctractFileName(Application.ExeName) - "Callist.exe"
Wenn das Programm gestartet wird mit einem Parameter so wird als
Mutex bzw sollte als
Mutex "Callist.exe#CMD" erstellt werden.
Sollte nun wiederum das Programm mit dem Parameter /OPEN geöffnet werden, soll die Instanz geschlossen werden. Danach eine neue erzeugt werden.
Wird das Programm mit dem Parameter /CLOSE geöffnet so soll nur die Instanz geschlossen werden.
Da es mit dem zweiten
Mutex nicht geklappt hat, habe ich ebenfalls nur "Callist.exe" als
Mutex verwendet.
Die exe habe ich in ein anderes Verzeichnis kopiert und gestartet ohne parameter. Starte ich aus Delphi heraus noch einmal die exe, bekommt sie den Focus. Klappt also...
Wenn ich allerdings aus Delphi heraus mit dem Parameter /OPEN starte, wird ein neuer Mtex erstellt mit dem Namen "Callist.exe" und einfach eine neue Instanz gestartet, das verstehe ich nicht...
Delphi-Quellcode:
procedure Instance();
var
Mutex: THandle;
Window: THandle;
MutexName:
string;
WindowTime: TDateTime;
begin
WindowTime := Now;
// Start der Instanz merken
MutexName := ExtractFileName(ParamStr(0));
// Callist.exe
if ParamCount = 0
then begin
Mutex := CreateMutex(
nil, True, PChar(MutexName));
if (
Mutex <> 0)
and (GetLastError <> ERROR_ALREADY_EXISTS)
then begin
Application.Initialize;
Application.Title := APPLICATION_TITLE;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMain, Main);
Application.Run;
end
else begin
Window := FindWindow(
nil, APPLICATION_TITLE);
if Window <> 0
then begin
Windows.ShowWindow(Window, SW_Normal);
Windows.SetForegroundWindow(Window);
end;
end;
end // bis hierhin klappt alles
else begin
if UpperCase(ParamStr(1)) = '
/OPEN'
then begin
Mutex := CreateMutex(
nil, True, PChar(MutexName));
// Mutex Name hat sich nicht geändert, dennoch kein Fehler...
if (
Mutex = 0)
and (GetLastError = ERROR_ALREADY_EXISTS)
then begin
Window := FindWindow(
nil, APPLICATION_TITLE);
if Window <> 0
then
SendMessage(Window, WM_CLOSE, 0, 0);
repeat
Sleep(200);
Window := FindWindow(
nil, APPLICATION_TITLE);
until Window = 0;
end;
CreateNewCallApp;
end
else if UpperCase(ParamStr(1)) = '
/CLOSE'
then begin
SendMessage(Window, WM_CLOSE, 0, 0);
end;
end;
end;
begin
Instance();
end.
Ich weiß nicht wo da der Fehler liegt, hat jemand dazu einen Rat?