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

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

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

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

Биллy Гейтсy пpиписывают следyющее высказывание: "Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо".

Алгоритм, применяемый мною:

В блоке begin..end модуля .dpr:


begin
  if HPrevInst <>0 then
  begin
    ActivatePreviousInstance;
    Halt;
  end;
end;

Реализация в модуле:


unit PrevInst;

interface

uses
  WinProcs,
  WinTypes,
  SysUtils;

type
  PHWnd = ^HWnd;

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;

procedure ActivatePreviousInstance;

implementation

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;
var
  ClassName: array[0..30] of char;
begin
  Result := true;
  if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst then
  begin
    GetClassName(Wnd, ClassName, 30);
    if STRIComp(ClassName, 'TApplication') = 0 then
    begin
      TargetWindow^ := Wnd;
      Result := false;
    end;
  end;
end;

procedure ActivatePreviousInstance;
var
  PrevInstWnd: HWnd;
begin
  PrevInstWnd := 0;
  EnumWindows(@EnumApps, LongInt(@PrevInstWnd));
  if PrevInstWnd <> 0 then
    if IsIconic(PrevInstWnd) then
      ShowWindow(PrevInstWnd, SW_Restore)
    else
      BringWindowToTop(PrevInstWnd);
end;

end.

Приведенный код на Delphi предназначен для предотвращения запуска второго экземпляра программы, проверяя, есть ли уже активный экземпляр приложения, и если так, то активирует этот экземпляр.

Вот шаг за шагом, как это работает:

  1. В блоке begin..end основного модуля производится проверка на существование предыдущего экземпляра приложения с помощью переменной HPrevInst.
  2. Если предыдущий экземпляр найден (HPrevInst <> 0), код вызывает процедуру ActivatePreviousInstance, которая:
    • Вызывает функцию EnumApps для перечисления всех окон в системе и поиск экземпляра текущего приложения.
    • Если экземпляр найден, она получает его обработчик (PrevInstWnd) и проверяет, является ли он иконическим (т. е., уменьшенным). Если экземпляр иконический, она восстанавливает окно с помощью ShowWindow(SW_Restore). В противном случае она приносит окно в передний план с помощью BringWindowToTop.
  3. После активации или восстановления предыдущего экземпляра программа основного модуля останавливается с помощью Halt для предотвращения запуска второго экземпляра.

Функция EnumApps перебирает все окна в системе и проверяет, является ли каждое из них экземпляром текущего приложения, сравнивая его имя класса с 'TApplication'. Если найден соответствующий экземпляр, она обновляет переменную TargetWindow и устанавливает результат в false.

Процедура ActivatePreviousInstance использует эту информацию для активации или восстановления предыдущего экземпляра.

Таким образом, это подход обеспечивает, что только один экземпляр программы может запускаться одновременно.

В статье описывается алгоритм и реализация функции для предотвращения запуска второй копии программы на ПК, предложенный Bill Gates, который рекомендует сделать программу выглядеть как можно лучше, даже если она не может быть сделана идеально.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-06 03:02:50/0.0032889842987061/0