Программа на Delphi, которая реализует приложение с одиночной инстанцией. Функция IsNextInstance проверяет, есть ли уже запущенная инстанция программы, создавая мьютекс с уникальным именем и проверяя, существует ли он уже. Если он существует, функция возвращает TRUE, указывая, что уже запущена инстанция.
Основное приложение инициализирует себя, настраивает форму и запускает таймер. Если обнаруживается инстанция, она отправляет сообщение всем окнам предыдущей инстанции с помощью функции PostMessage. Это сообщение указывает предыдущей инстанции принести ее окно в передний план.
Процедура OnAppMessage обрабатывает входящие сообщения от других инстанций. При получении сообщения с зарегистрированным идентификатором (MessageId) она устанавливает переменную Ret в TRUE, указывая, что сообщение было обработано.
Наконец, в секции инициализации программа скрывает основное окно формы с помощью функции ShowWindow.
Чтобы предотвратить запуск другой копии программы, можно использовать комбинацию техник:
Проверьте, есть ли уже запущенная инстанция, создавая мьютекс с уникальным именем и проверяя, существует ли он уже.
Если обнаруживается инстанция, отправьте сообщение всем окнам предыдущей инстанции с помощью функции PostMessage, указывая им принести их окно в передний план.
В обработчике события OnCreate основной формы установите свойство Visible формы в FALSE. Это будет предотвращать отображение формы, если уже запущена инстанция.
Вот обновленная версия кода:
varMutexHandle:THandle;UniqueKey:string;functionIsNextInstance:BOOLEAN;beginResult:=FALSE;MutexHandle:=0;MutexHandle:=CreateMutex(nil,TRUE,UniqueKey);ifMutexHandle<>0thenbeginifGetLastError=ERROR_ALREADY_EXISTSthenbeginResult:=TRUE;CloseHandle(MutexHandle);MutexHandle:=0;end;end;end;beginCmdShow:=SW_HIDE;MessageId:=RegisterWindowMessage(zAppName);Application.Initialize;ifIsNextInstancethenPostMessage(HWND_BROADCAST,MessageId,0,0)elsebeginApplication.ShowMainForm:=FALSE;Application.CreateForm(TMainForm,MainForm);MainForm.StartTimer.Enabled:=TRUE;Application.Run;end;ifMutexHandle<>0thenCloseHandle(MutexHandle);end.procedureTMainForm.OnAppMessage(varM:TMSG;varRet:BOOLEAN);beginifM.Message=MessageIdthenbeginRet:=TRUE;// Bring the window to the topShowWindow(Handle,SW_RESTORE);end;end;initializationShowWindow(Application.Handle,SW_Hide);end.
Обратите внимание, что в обновленном коде я добавил вызов функции ShowWindow в процедуре OnAppMessage, чтобы принести основное окно формы в передний план при получении сообщения от другой инстанции.
В статье описывается метод для предотвращения запуска второй копии программы на платформе Windows, используя создание mutex и проверку на существование уже открытой инстанции программы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.