Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > сворачивание приложение


Автор: z-END 3.3.2006, 19:39
Есть приложение, при его минимизации (Application.OnMinimize) приложение "переезжает в трей",
но очень хочется чтобы одна формочка необращала внимание на минимизацию и продолжала работать как ни в чем нибывало... как это осуществить?

Автор: Snowy 3.3.2006, 19:51
Нужно вместо минимизации прятать формы.

Автор: z-END 3.3.2006, 19:52
Snowy, это конечно правильно... но я юзаю уже готовый компонент, который использует какраз минимизацию smile

Автор: Snowy 3.3.2006, 19:59
По другому никак. Разве что второе приложение делать.
Если свернуто приложение, то все формы не видны.
Вывод один - не используй готовый компонент или переправь под свои нужды.
У меня такая же проблема была. Написал свою реализацию и сделал так, как нужно.
Тут же все просто. Никакой компонент нафиг не нужен.

Автор: Snowy 3.3.2006, 20:30
Вот пример. В нем я сделал только сворачивание главной формы, без сворачивания остальных.
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  private
    procedure WMTRAY_MAINICON(var Mes: Messages.TMessage);
                              message WM_TRAYICON + MAIN_ICON;
    procedure OnMinimize(var Mes: Messages.TMessage); message WM_SYSCOMMAND;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.OnMinimize(var Mes: Messages.TMessage);
begin
  if Mes.WParam = SC_MINIMIZE then
  begin
    Hide;
    ShowWindow(Application.Handle, SW_HIDE);
    AddIcon(MAIN_ICON, Form1.Icon.Handle, Form1.Caption);
  end else inherited;
end;

procedure TForm1.WMTRAY_MAINICON(var Mes: Messages.TMessage);
begin
  case Mes.LParam of
    WM_LBUTTONDBLCLK: begin
                        Show;
                        ShowWindow(Application.Handle, SW_SHOW);
                        SetForegroundWindow(Handle);
                        DeleteIcon(MAIN_ICON);
                      end;
    end;
end;

end.


Вот модуль для работы с иконкой.
Код
unit TrayIcon;

interface

uses Windows, Messages, ShellAPI, Forms;

const
  WM_TRAYICON = WM_APP + 1;
  MAIN_ICON = 1;

procedure AddIcon(ID: byte = MAIN_ICON; IcoN: HIcon = 0; Tip: string = '');
{* Добавляет иконку в трей. На входе:
   ID - id иконки (def = MAIN_ICON);
   IcoN - номер иконки в exe (def = 0) или hIcon нужной иконки
   Tip - Hint на иконе (def = '') }

procedure DeleteIcon(ID: byte = MAIN_ICON);
{* Убивает икону в трее. На входе: ID - id иконки (def - ) }

procedure ModifyIcon(ID: byte = MAIN_ICON; IcoN:HIcon=0;Tip:string='');
{* Изменяет параметры иконы - иконку и/или хинт. На входе то же, что и AddIcon }

implementation

type
  PNotifyIconData = ^TNotifyIconData;
  TNotifyIconData = record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array [0..63] of AnsiChar;
  end;

function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall; external 'shell32.dll' name 'Shell_NotifyIconA';

function TaskBarAddIcon(hWindow: HWND; ID: Cardinal; ICON: hIcon;
 CallbackMessage: Cardinal; Tip: PChar): Boolean;
var
  NID: TNotifyIconData;
begin
  FillChar(NID, SizeOf(TNotifyIconData), 0);
  with NID do begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd   := hWindow;
    uID    := ID;
    uFlags := 7; // MESSAGE or ICON or TIP
    uCallbackMessage := CallbackMessage;
    hIcon  := Icon;
    lstrcpyn(szTip, Tip, SizeOf(szTip));
  end;
  Result := Shell_NotifyIcon(0, @NID); // AddIcon
end;

function TaskBarDeleteIcon(hWindow: HWND; ID: Integer): Boolean;
var
  NID: TNotifyIconData;
begin
  FillChar(NID, SizeOf(TNotifyIconData), 0);
  with NID do begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd    := hWindow;
    uID    := ID;
  end;
  Result := Shell_NotifyIcon(2, @NID); // DeleteIcon
end;

function TaskBarModifyIcon(hWindow: HWND; ID: Cardinal; Flags: Cardinal;
 ICON: hIcon; Tip: PChar): Boolean;
var
  NID: TNotifyIconData;
begin
  FillChar(NID, SizeOf(TNotifyIconData), 0);
  with NID do begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd    := hWindow;
    uID    := ID;
    uFlags := Flags;
    hIcon  := Icon;
    lstrcpyn(szTip, Tip, SizeOf(szTip));
  end;
  Result := Shell_NotifyIcon(1, @NID);
end;

procedure AddIcon(ID:byte=MAIN_ICON;IcoN:HIcon=0;Tip:string='');
var
  h: hIcon;
begin
  if IcoN < 10 then
    h := ExtractIcon(hInstance, PChar(ParamStr(0)), IcoN)
  else h := IcoN;
  if h <> 0 then
    TaskBarAddIcon(Application.MainForm.Handle, ID,
                   h, WM_TRAYICON + ID, PChar(Tip));
end;

procedure DeleteIcon(ID: byte = MAIN_ICON);
begin
  TaskBarDeleteIcon(Application.MainForm.Handle, ID);
end;

procedure ModifyIcon(ID: byte = MAIN_ICON; IcoN:HIcon=0;Tip:string='');
const
  NIF_ICON        = $00000002;
  NIF_TIP         = $00000004;
var
  h: hIcon;
begin
  if IcoN < 10 then
    h := ExtractIcon(hInstance, PChar(ParamStr(0)), IcoN)
  else h := IcoN;
  if h <> 0 then
    TaskBarModifyIcon(Application.MainForm.Handle, ID, NIF_ICON,
                      h, PChar(Tip));
end;

end.

Причем иконок может быть много - хоть по одной на каждую форму.
Только ID им разный задавай.

Автор: Quadr0 3.3.2006, 22:25
...

Автор: Snowy 4.3.2006, 02:21
Цитата(Quadr0 @ 3.3.2006, 22:25 Найти цитируемый пост)
ShowWindow(Application.Handle, SW_HIDE);
Это же наоборот прячет форму?

Не форму, а Aplication - убираем с панели задач.

Автор: z-END 4.3.2006, 14:14
Quadr0, действительно, твой вариант помогает обойти эту проблему, но появляется дургая - если отображается это окно, до даже при минимизированном приложении, оно отображается на панели задач, а этого быть недолжно. т.к. приложение при минимизации переезжает жить в трей.

Автор: Yanis 4.3.2006, 14:22
Цитата(z-END @ 4.3.2006, 14:14 Найти цитируемый пост)
даже при минимизированном приложении, оно отображается на панели задач, а этого быть недолжно

см. Snowy Дата 4.3.2006, 02:21 (ссылка)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)