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

Активизация предыдущего экземпляра вашей программы

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

Активизация предыдущего экземпляра вашей программы

Если внутренняя переменная hPrevInst не равна нулю, то она содержит дескриптор предыдущего запущенного экземпляра вашей программы. Вы просто находите открытое окно по его дескриптору и, при необходимости, выводите на передний план. Весь код расположен в файле .DPR file, НЕ в модуле. Строки, которые вам необходимо добавить к вашему .DPR-файлу, в приведенном ниже примере помечены {*}.


program Once;

uses
{*}  WinTypes, WinProcs, SysUtils,

Forms,
Onceu in 'ONCEU.PAS' {Form1};

{$R *.RES}
{*}TYPE
{*}  PHWND = ^HWnd;

{*}  FUNCTION EnumWndProc(H : hWnd; P : PHWnd) : Integer; Export;
{*}  VAR ClassName : ARRAY[0..30] OF Char;
{*}  BEGIN
{*}    {Если это окно принадлежит предшествующему экземпляру...}
{*}    IF GetWindowWord(H, GWW_HINSTANCE) = hPrevInst THEN
{*}      BEGIN
{*}        {... проверяем КАКОЕ это окно.}
{*}        GetClassName(H, ClassName, 30);
{*}        {Если это главное окно приложения...}
{*}        IF StrIComp(ClassName, 'TApplication') = 0 THEN
{*}          BEGIN
{*}            {... ищем}
{*}{*}            P^ := H;
{*}            EnumWndProc := 0;
{*}          END;
{*}      END;
{*}  END;

{*}  PROCEDURE CheckPrevInst;
{*}  VAR PrevWnd : hWnd;
{*}  BEGIN
{*}    IF hPrevInst <> 0 THEN
{*}      {Предыдущий экземпляр запущен}
{*}      BEGIN
{*}        PrevWnd := 0;
{*}        EnumWindows(@EnumWndProc, LongInt(@PrevWnd));
{*}        {Ищем дескриптор окна предыдущего}
{*}        {экземпляра и активизируем его}
{*}        IF PrevWnd <> 0 THEN
{*}          IF IsIconic(PrevWnd) THEN
{*}            ShowWindow(PrevWnd, SW_SHOWNORMAL)
{*}          ELSE BringWindowToTop(PrevWnd);
{*}        Halt;
{*}      END;
{*}  END;
begin
{*}  CheckPrevInst;

Application.Title := 'Once';
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Here is a translation of the content into Russian:

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

Вот разбивка кода:

  1. Первая секция включает в себя необходимые единицы для работы с Windows и Delphi.
  2. Тип PHWND определяется как указатель на тип HWnd, который представляет handle окна в Windows.
  3. Функция EnumWndProc объявляется, которая принимает два параметра: H (handle окна) и P (указатель на HWnd). Эта функция вызывается для каждого окна в системе, и она проверяет, принадлежит ли окно предыдущему экземпляру приложения.
  4. Если окно принадлежит предыдущему экземпляру, функция вызывает GetClassName, чтобы получить имя класса окна, а затем проверяет, совпадает ли это имя с 'TApplication', которое является основной формой приложения. Если это так, функция устанавливает указатель P в handle H и возвращает 0.
  5. Процедура CheckPrevInst объявляется, которая проверяет, не равно ли hPrevInst 0 (т.е., предыдущий экземпляр был запущен). Если это так, она вызывает EnumWindows, чтобы перечислить все окна в системе, передавая адрес EnumWndProc как функцию обратного вызова. Эта функция ищет handle окна предыдущего экземпляра и активирует его.
  6. Основная часть программы вызывает CheckPrevInst, а затем устанавливает заголовок приложения и создает экземпляр формы с помощью Application.CreateForm. Наконец, программа запускается с помощью Application.Run.

Чтобы реализовать эту функциональность в файле .DPR, вам нужно добавить следующий код:

program Once;
uses
  WinTypes, WinProcs, SysUtils,
  Forms,
  Onceu in 'ONCEU.PAS' {Form1};

{$R *.RES}

type
  PHWnd = ^HWnd;

function EnumWndProc(H: hWnd; P: PHWnd): Integer; export;
var
  ClassName: array[0..30] of Char;
begin
  // ...
end;

procedure CheckPrevInst;
var
  PrevWnd: hWnd;
begin
  if hPrevInst <> 0 then
  begin
    PrevWnd := 0;
    EnumWindows(@EnumWndProc, LongInt(@PrevWnd));
    if PrevWnd <> 0 then
    begin
      if IsIconic(PrevWnd) then
        ShowWindow(PrevWnd, SW_SHOWNORMAL)
      else
        BringWindowToTop(PrevWnd);
    end;
    Halt;
  end;
end.

begin
  CheckPrevInst;
  Application.Title := 'Once';
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Обратите внимание, что вам нужно заменить 'ONCEU.PAS' на фактический путь и имя файла единицы вашей формы.

Активизация предыдущего экземпляра вашей программы возможна при помощи переменной hPrevInst, которая содержит дескриптор предыдущего запущенного экземпляра вашей программы, и функции EnumWindows для поиска открытого окна.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:20:10/0.013799905776978/1