unit PrevInst;
interfaceuses
WinProcs,
WinTypes,
SysUtils;
type
PHWnd = ^HWnd;
function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;
procedure ActivatePreviousInstance;
implementationfunction EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;
var
ClassName: array[0..30] of char;
begin
Result := true;
if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst thenbegin
GetClassName(Wnd, ClassName, 30);
if STRIComp(ClassName, 'TApplication') = 0 thenbegin
TargetWindow^ := Wnd;
Result := false;
end;
end;
end;
procedure ActivatePreviousInstance;
var
PrevInstWnd: HWnd;
begin
PrevInstWnd := 0;
EnumWindows(@EnumApps, LongInt(@PrevInstWnd));
if PrevInstWnd <> 0 thenif IsIconic(PrevInstWnd) then
ShowWindow(PrevInstWnd, SW_Restore)
else
BringWindowToTop(PrevInstWnd);
end;
end.
Приведенный код на Delphi предназначен для предотвращения запуска второго экземпляра программы, проверяя, есть ли уже активный экземпляр приложения, и если так, то активирует этот экземпляр.
Вот шаг за шагом, как это работает:
В блоке begin..end основного модуля производится проверка на существование предыдущего экземпляра приложения с помощью переменной HPrevInst.
Если предыдущий экземпляр найден (HPrevInst <> 0), код вызывает процедуру ActivatePreviousInstance, которая:
Вызывает функцию EnumApps для перечисления всех окон в системе и поиск экземпляра текущего приложения.
Если экземпляр найден, она получает его обработчик (PrevInstWnd) и проверяет, является ли он иконическим (т. е., уменьшенным). Если экземпляр иконический, она восстанавливает окно с помощью ShowWindow(SW_Restore). В противном случае она приносит окно в передний план с помощью BringWindowToTop.
После активации или восстановления предыдущего экземпляра программа основного модуля останавливается с помощью Halt для предотвращения запуска второго экземпляра.
Функция EnumApps перебирает все окна в системе и проверяет, является ли каждое из них экземпляром текущего приложения, сравнивая его имя класса с 'TApplication'. Если найден соответствующий экземпляр, она обновляет переменную TargetWindow и устанавливает результат в false.
Процедура ActivatePreviousInstance использует эту информацию для активации или восстановления предыдущего экземпляра.
Таким образом, это подход обеспечивает, что только один экземпляр программы может запускаться одновременно.
В статье описывается алгоритм и реализация функции для предотвращения запуска второй копии программы на ПК, предложенный Bill Gates, который рекомендует сделать программу выглядеть как можно лучше, даже если она не может быть сделана идеально.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.