Zitat von
Sharky:
ich habe das einfach über einen
Mutex gelöst:
... und dabei aber vergessen, den
Mutex am Ende mit "CloseHandle" oder "ReleaseMutex" freizugeben. Ein besserer Weg wäre daher dieser, weil er die alte Instanz in den Vordergrund holt:
Code:
mHandle := CreateMutex([b]nil[/b], True, '{13971189-D133-4D62-9510-AF8EACD8E366}');
[b]if[/b] GetLastError = ERROR_ALREADY_EXISTS [b]then[/b]
[b]begin[/b]
[color=#000080][i]// Name "TDeineForm" richtet sich nach dem Namen deiner Form! :o) -->[/i][/color]
SendMessage(findwindow('TDeineForm',[b]nil[/b]),WM_SYSCOMMAND,SC_RESTORE,0);
SetForegroundWindow(findwindow('TDeineForm',[b]nil[/b]));
[b]end[/b]
[b]else[/b]
[b]begin[/b]
[color=#000080][i]// bla bla[/i][/color]
[b]end[/b];
ReleaseMutex(mHandle);
Und in der
Unit, um Probleme mit dem Minimieren zu vermeiden:
Code:
[b]type[/b]
TDeineForm = [b]class[/b](TForm)
...
[b]private[/b]
[b]procedure[/b] WmSysCommand([b]var[/b] [b]Message[/b]: TMessage); [b]message[/b] WM_SYSCOMMAND;
...
[b]end[/b];
[b]procedure[/b] TDeineForm.WmSysCommand([b]var[/b] [b]Message[/b]: TMessage);
[b]begin[/b]
[b]if[/b]([b]Message[/b].Msg = WM_SYSCOMMAND) [b]and[/b] ([b]Message[/b].wParam = SC_RESTORE) [b]then[/b]
Application.Restore;
[b]inherited[/b];
[b]end[/b];
Im Entwickler-Forum gibt´s irgendwo noch eine Diskussion über "Semaphore", mit denen man auch festlegen kann, dass z.B. die Anwendung zweimal gleichzeitig aktiv sein kann. Jeder Startversuch darüber hinaus wird geblockt. Auch ein interessanter Ansatz.