Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как не допустить запуск второй копии программы 9

Delphi , Программа и Интерфейс , Приложение своё

Как не допустить запуск второй копии программы 9

Можно ли программу, написанную под Windоws, называть подоконником?


var
  MutexHandle: THandle;
var
  UniqueKey: string;

function IsNextInstance: BOOLEAN;
begin

  Result := FALSE;

  MutexHandle := 0;
  MutexHandle := CREATEMUTEX(nil, TRUE, UniqueKey);
  if MutexHandle <> 0 then
  begin
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      Result := TRUE;
      CLOSEHANDLE(MutexHandle);
      MutexHandle := 0;
    end;
  end;
end;

begin

  CmdShow := SW_HIDE;
  MessageId := RegisterWindowMessage(zAppName);
  Application.Initialize;
  if IsNextInstance then
    PostMessage(HWND_BROADCAST, MessageId, 0, 0)
  else
  begin
    Application.ShowMainForm := FALSE;
    Application.CreateForm(TMainForm, MainForm);
    MainForm.StartTimer.Enabled := TRUE;
    Application.Run;
  end;
  if MutexHandle <> 0 then
    CLOSEHANDLE(MutexHandle);
end.

В MainForm вам необходимо вставить обработчик внутреннего сообщения


procedure TMainForm.OnAppMessage(var M: TMSG; var Ret: BOOLEAN);
begin
  if M.Message = MessageId then
  begin
    Ret := TRUE;
    // Поместить окно наверх !!!!!!!!
  end;
end;

initialization
  ShowWindow(Application.Handle, SW_Hide);
end.

Программа на Delphi, которая реализует приложение с одиночной инстанцией. Функция IsNextInstance проверяет, есть ли уже запущенная инстанция программы, создавая мьютекс с уникальным именем и проверяя, существует ли он уже. Если он существует, функция возвращает TRUE, указывая, что уже запущена инстанция.

Основное приложение инициализирует себя, настраивает форму и запускает таймер. Если обнаруживается инстанция, она отправляет сообщение всем окнам предыдущей инстанции с помощью функции PostMessage. Это сообщение указывает предыдущей инстанции принести ее окно в передний план.

Процедура OnAppMessage обрабатывает входящие сообщения от других инстанций. При получении сообщения с зарегистрированным идентификатором (MessageId) она устанавливает переменную Ret в TRUE, указывая, что сообщение было обработано.

Наконец, в секции инициализации программа скрывает основное окно формы с помощью функции ShowWindow.

Чтобы предотвратить запуск другой копии программы, можно использовать комбинацию техник:

  1. Проверьте, есть ли уже запущенная инстанция, создавая мьютекс с уникальным именем и проверяя, существует ли он уже.
  2. Если обнаруживается инстанция, отправьте сообщение всем окнам предыдущей инстанции с помощью функции PostMessage, указывая им принести их окно в передний план.
  3. В обработчике события OnCreate основной формы установите свойство Visible формы в FALSE. Это будет предотвращать отображение формы, если уже запущена инстанция.

Вот обновленная версия кода:

var
  MutexHandle: THandle;
  UniqueKey: string;

function IsNextInstance: BOOLEAN;
begin
  Result := FALSE;

  MutexHandle := 0;
  MutexHandle := CreateMutex(nil, TRUE, UniqueKey);
  if MutexHandle <> 0 then
  begin
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      Result := TRUE;
      CloseHandle(MutexHandle);
      MutexHandle := 0;
    end;
  end;
end;

begin
  CmdShow := SW_HIDE;
  MessageId := RegisterWindowMessage(zAppName);
  Application.Initialize;
  if IsNextInstance then
    PostMessage(HWND_BROADCAST, MessageId, 0, 0)
  else
  begin
    Application.ShowMainForm := FALSE;
    Application.CreateForm(TMainForm, MainForm);
    MainForm.StartTimer.Enabled := TRUE;
    Application.Run;
  end;
  if MutexHandle <> 0 then
    CloseHandle(MutexHandle);
end.

procedure TMainForm.OnAppMessage(var M: TMSG; var Ret: BOOLEAN);
begin
  if M.Message = MessageId then
  begin
    Ret := TRUE;
    // Bring the window to the top
    ShowWindow(Handle, SW_RESTORE);
  end;
end;

initialization
  ShowWindow(Application.Handle, SW_Hide);
end.

Обратите внимание, что в обновленном коде я добавил вызов функции ShowWindow в процедуре OnAppMessage, чтобы принести основное окно формы в передний план при получении сообщения от другой инстанции.

В статье описывается метод для предотвращения запуска второй копии программы на платформе Windows, используя создание mutex и проверку на существование уже открытой инстанции программы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Приложение своё ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:19:35/0.0037739276885986/0