Работая с некоторыми приложениями нужно быть уверенным, что нельзя запустить второй экземпляр этого же приложения. Внося какие либо данные, после этого сделав перерыв, забыв что приложение уже запущено, запустить его вновь и продолжать делать уже сделанную работу.
Рассмотрим вариант когда вторая копия приложения будет закрыта, нам о этом будет сообщено, а первый экземпляр приложения будет активирован.
Запуская программу, с помощью функции API - FindWindow, будем просматривать список открытых в системе окон и проверять не открыто ли главное окно нашей программы. Если искомое окно не найдено, то функция FindWindow вернет нулевое значение, в противном случае будет возвращен дескриптор окна.
Обращение к данной функции должно быть совершено в процессе инициализации приложения. Иначе если вызывать поиск из главной формы, то к этому моменту форма будет уже создана и открыта. И найдя саму себя приложение заблокирует свою работу и не будет запускаться никогда.
Создадим новое приложение и присвоим форме имя - fmMain. Класс формы будет автоматически присвоен -TfmMain. Свойству Caption формы присвоим значение - "Моя программа".
Придумывая данные значения необходимо подбирать оригинальные значения, которые не могли бы повторяться (иначе может получиться так, что приложение не запуститься).
С помощью API - функции SetForegroundWindow(hwndWindow: HWND): Boolean окно с числом дескриптора равным hwndWindow будет размещено поверх других окон.
Что бы форма приложения не была пустой, я разместил на форме компонент Edit с кнопкой, которая при нажатии устанавливает значение 55.
Полный текст кода приложения расположен ниже:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfmMain = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var fmMain: TfmMain; H: HWND; implementation {$R *.dfm} procedure TfmMain.Button1Click(Sender: TObject); begin Edit1.Text:='55'; end; initialization begin H:=FindWindow('TfmMain','Моя программа'); if h<>0 then begin Try ShowMessage(' Программа уже загружена!'); SetForegroundWindow(h); application.Terminate; except end; end; end; end.
При открытом главном окне программы в системе, если мы попытаемся запустить второй экземпляр приложения функция FindWindow возвратит ненулевое значение. Что заставит, с помощью функции SetForegroundWindow, активизировать окно нашего приложения и разместить его поверх всех остальных окон, а процесс выполнения второго экземпляра будет прерван.