Nano Hash - криптовалюты, майнинг, программирование

Delphi: сворачивание приложения в системную панель

Я хочу свести приложение Delphi к панели задач вместо панели задач.

Необходимые шаги кажутся следующими:

  1. Создайте значок, который затем должен отображаться в панели задач.
  2. When the user clicks the [-] to minimize the application, do the following:
    1. Hide the form.
    2. Добавьте значок (шаг №1) на панель задач.
    3. Скрыть / удалить запись о приложении на панели задач.
  3. When the user double-clicks the application's icon in the systray, do the following:
    1. Show the form.
    2. Снова отмените сворачивание приложения и выведите его на передний план.
    3. Если «WindowState» имеет значение «WS_Minimized», установите значение «WS_Normal».
    4. Скрыть / удалить значок приложения на панели задач.
  4. When the user terminates the application, do the following:
    1. Hide/delete the application's icon in the systray.

Вот и все. Правильно?

Как это реализовать в Delphi?

Я нашел следующий код, но не знаю, почему он работает. Это не соответствует моим шагам, описанным выше ...

unit uMinimizeToTray;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellApi;

const WM_NOTIFYICON = WM_USER+333; 

type
  TMinimizeToTray = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CMClickIcon(var msg: TMessage); message WM_NOTIFYICON;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  MinimizeToTray: TMinimizeToTray;

implementation

{$R *.dfm}

procedure TMinimizeToTray.CMClickIcon(var msg: TMessage);
begin
  if msg.lparam = WM_LBUTTONDBLCLK then Show;
end;

procedure TMinimizeToTray.FormCreate(Sender: TObject);
VAR tnid: TNotifyIconData;
    HMainIcon: HICON;
begin
  HMainIcon := LoadIcon(MainInstance, 'MAINICON');
  Shell_NotifyIcon(NIM_DELETE, @tnid);
  tnid.cbSize := sizeof(TNotifyIconData);
  tnid.Wnd := handle;
  tnid.uID := 123;
  tnid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  tnid.uCallbackMessage := WM_NOTIFYICON;
  tnid.hIcon := HMainIcon;
  tnid.szTip := 'Tooltip';
  Shell_NotifyIcon(NIM_ADD, @tnid);
end;

procedure TMinimizeToTray.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone;
  Hide;
end;

end.

  • Раньше считалось, что TApplication создавал запись на панели задач, а TForms могли действовать независимо. Изменилось ли это в последнее время? 22.05.2010
  • Какую версию Delphi вы используете? В более новых версиях в VCL есть TTrayIcon, который вы можете использовать, по крайней мере, для создания значка в трее. 22.05.2010
  • В этом код отличается от ваших шагов; - значок панели задач всегда виден, - он не мешает «сворачиванию» (шаг 2 отсутствует), при двойном щелчке по значку отображается форма, которая была скрыта нажатием кнопки закрытия [X], - а также не учитывает прерывание (нет шага 4). 23.05.2010
  • TTrayIcon с реализацией событий DoubleClick и ApplicationMinimize является самым простым с использованием компонентов VCL. 23.05.2010
  • @Andreas Rejbrand: К сожалению, я использую Delphi 7. Похоже, что он там не реализован. 24.05.2010

Ответы:


1

Я бы рекомендовал использовать CoolTrayIcon. Автор уже проработал все вопросы, связанные с иконками в трее. Это бесплатно с исходным кодом и примерами и очень отлажено.

http://subsimple.com/delphi.asp

22.05.2010
  • Этот компонент работает нормально. Он делает все, что нужно для TrayIcon. Спасибо! 25.05.2010

  • 2

    Если он все еще работает, вероятно, проще всего использовать JVCL TJvTrayIcon для автоматической обработки.

    22.05.2010
  • Наверное, я просто тупил, но не нашел для этого ссылки на скачивание. Спасибо хоть! ;) Если посмотреть на +3 голоса, то ответ кажется хорошим ... 25.05.2010
  • Это ссылка "Загрузки" слева от первой ссылки. 25.05.2010

  • 3

    Вместо Application.BringToFront; используйте SetforegroundWindow(Application.Handle);

    27.10.2018

    4

    В следующем тексте я буду иметь в виду номера шагов, упомянутые в вопросе:

    Следующее решение без каких-либо дополнительных компонентов. Реализовать очень просто.

    Шаг №1:

    Просто используйте основной значок приложения (см. Следующий код).

    Шаг № 2:

    procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
    begin
      Shell_NotifyIcon(NIM_ADD, @TrayIconData);
      Form1.Hide;
    end;
    

    Шаг № 3:

    procedure TForm1.TrayMessage(var Msg: TMessage);
    begin
      if Msg.lParam = WM_LBUTTONDOWN then begin
        Form1.Show;
        Form1.WindowState := wsNormal;
        Application.BringToFront;
        Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
      end;
    end;
    

    Шаг 4:

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
    end;
    

    Необходимый код в интерфейсной части:

    uses
      [...], ShellApi;
    
    const
      WM_ICONTRAY = WM_USER + 1;
    
    type
      TForm1 = class(TForm)
        [...]
        procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
      end;
    

    Единственная проблема: приложение можно свернуть в панель задач только один раз. В следующий раз, когда вы захотите его свернуть, ничего не произойдет. Почему?

    Источник: delphi.about.com

    23.05.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..