Hmm..
Das ist die einfachste Lösung, wenn man sicherstellen will, dass ein Programm nur einmal gestartet wird.
Was diese Lösung aber nicht kann:
Die übergebenen Parameter an die erste Instanz weiterreichen, damit diese damit weiterarbeiten kann.
Und genau da liegt ja aktuell das Problem.
Wieso sendest Du dann nicht eine Message an deine andere Instanz?
Z.B. in der
DPR (wie oben als Beispiel)
Delphi-Quellcode:
const
c_ProgStartMutexName = '
MeinProgrammName';
{Attempt to create a named mutex}
CreateMutex(
nil, false, c_ProgStartMutexName);
{if it failed then there is another instance}
if GetLastError = ERROR_ALREADY_EXISTS
then
begin
{Send all windows our custom message - only our other}
{instance will recognise it}
SendMessage(HWND_BROADCAST,
RegisterWindowMessage(c_ProgStartMutexName),
0,
0);
{Lets quit}
Halt(0);
end;
Application.Initialize;
Dort, im Hauptfenster vorher:
Delphi-Quellcode:
const
c_ProgStartMutexName = 'MeinProgrammName';
var
OldWindowProc : Pointer; {Variable for the old windows proc}
MyMsg : Int64; {custom systemwide message}
function NewWindowProc(WindowHandle : hWnd;TheMessage : LongInt;
ParamW : LongInt; ParamL : LongInt) : LongInt stdcall;
begin
if TheMessage = MyMsg then begin
{Tell the application to restore, let it restore the form}
SendMessage(Application.handle, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(Application.Handle);
{We handled the message - we are done}
Result := 0;
exit;
end;
{Call the original winproc}
Result := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
end;
procedure TFormMeineMainForm.FormCreate(Sender: TObject);
begin
//Register a custom windows message
MyMsg := RegisterWindowMessage(c_ProgStartMutexName);
//Set form1's windows proc to ours and remember the old window proc
OldWindowProc := Pointer(SetWindowLong(FormHauptmenue.Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));
..
end;
In diesem Beispiel wird der ersten Instanz einfach nur mitgeteilt, dass sie sich wieder nach vorne bringen soll..
Kannst aber auch eine andere Message oder
IPC verwenden, um z.B. deinen Sting zu übergeben.