Компонент TrayComp Delphi , Рабочий стол , TrayBar  
Компонент TrayComp 
Автор: Alexander Rodigin 
{************* FREEWARE ******************} {****************************************************} {************* copyright (c) ******************} {************* Alexander Rodigin ******************} {************* ras@ras.udm.ru ******************} {************* May 6 1999 Russia ******************} {*****************************************************
TrayComponent is a mix of two components:
Stealth by Janus N. Tшndering 1998
[j@nus.person.dk]
with thanks to...
Eric Lawrence [deltagrp@juno.com]
John Molyneux [jaymol@hotmail.com]
copyright © Amigreen Software 1998
and
TrayIcon by Pete Ness
Compuserve ID: 102347,710
Internet: 102347.710@compuserve.com
http:\\ourworld.compuserve.com\homepages\peteness.
Some properties were modified.
Also some new properties were added :
1)ShowInTaskBar allow not to minimize the form onto TaskBar;
2)ShowForm allow completely hide the form from the user and Alt-Tab Menu;
3)RunMinimized disallow application's start-up in minimized state
  because minimized form will appear onto Task Bar;
4)DefRClick and DefLClick activates the form if ShowForm = true
  and no code assigned to these eventhandlers;
5)the Icon by default is the application's icon;
6)HideApp doesn't conflict with Windows NT now;
The first time you try TTrayComponent just put it onto the form and
run app to test default options.
Any changes,bugs and suggestions please report to ras@ras.udm.ru} unit  TrayComp;
interface 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, ShellAPI, Menus, Dialogs, CommCtrl;
const 
  WM_FROMTRAYICON = WM_USER+59;
  WM_RESETTOOLTIP = WM_USER+61;
type 
  TTrayComp = class (TComponent)
  private 
    { Private declarations } { general } { for hiding } { for icon } string ;
    FShowIcon : Boolean;
    FPopupMenu : TPopupMenu;
    FDefRClick : Boolean;
    FDefLClick : Boolean;
    FOnLeftClick : TNotifyEvent;
    FOnRightClick : TMouseEvent;
    FOnMouseMove : TNotifyEvent;
    { for hiding } procedure  SetHideApp(Value:Boolean);
    procedure  SetShowForm(Value:Boolean);
    procedure  SetShowInTaskBar(Value: Boolean);
    procedure  InsertHook;
    procedure  RemoveHook;
    procedure  OurWndProc(var  M: TMessage);
    { for icon } function  PlaceIcon : Boolean;
    function  ReplaceIcon : Boolean;
    function  EraseIcon : Boolean;
    procedure  SetShowIcon(Value : Boolean);
    procedure  SetIcon(Value : TIcon);
    procedure  SetToolTip(Value : string );
    procedure  FillIconData;
    procedure  DoRightClick(Sender : TObject);
    procedure  DoLeftClick(Sender : TObject);
    procedure  DoMouseMove(Sender:TObject);
  protected 
    { Protected declarations } { for hiding } procedure  Loaded; override ;
    procedure  DoHiding;
  public 
    { Public declarations } constructor  Create(AOwner: TComponent); override ;
    destructor  Destroy; override ;
  published 
    { Published declarations } { for hiding } property  HideApp :Boolean read  FHideApp write  SetHideApp ;
    property  ShowForm :Boolean read  FShowForm write  SetShowForm default  True;
    property  ShowInTaskBar:Boolean read  FShowInTaskBar write  SetShowInTaskBar default  False;
    property  RunMinimized :Boolean read  FRunMinimized write  FRunMinimized default  False;
    { for icon } property  ShowIcon : boolean read  FShowIcon write  SetShowIcon;
    property  Icon : TIcon read  FIcon write  SetIcon;
    property  ToolTip : string  read  FTooltip write  SetToolTip;
    property  PopupMenu : TPopupMenu read  fPopupMenu write  fPopupMenu;
    property  DefRClick : Boolean read  FDefRClick write  FDefRClick default  False;
    property  DefLClick : Boolean read  FDefLClick write  FDefLClick default  True;
    property  OnLeftClick : TNotifyEvent read  FOnLeftClick write  FOnLeftClick;
    property  OnRightClick : TMouseEvent read  FOnRightClick write  FonRightClick;
    property  OnMouseMove : TNotifyEvent read  FOnMouseMove write  FOnMouseMove;
  end ;
procedure  register ;
implementation 
constructor  TTrayComp.Create(AOwner: TComponent);
var 
  i: Integer;
  Already:Byte;
begin 
  inherited  Create(AOwner);
  { for hiding } nil ;
  OldWndProc := nil ;
  Already:=0;
  if  (csDesigning in  ComponentState) then 
    if  (AOwner is  TForm) then 
      with  (AOwner as  TForm) do 
      begin 
        for  i := 0 to  ComponentCount - 1 do 
          if  Components[i] is  TTrayComp then 
            Inc(Already);
        if  Already>1 then 
          raise  Exception.Create('You can''t create a second TTrayComp on the same form!');
      end 
    else 
      raise  Exception.Create('You can create a TTrayComp only on the form!');
  { for icon } if  (csDesigning in  ComponentState) then 
    SetIcon(Application.Icon);
end ;
destructor  TTrayComp.Destroy;
begin 
  { for hiding } { for icon } if  not  (csDesigning in  ComponentState)then 
    if  FShowIcon then 
      EraseIcon;
  FIcon.Free;
  inherited  Destroy;
end ;
procedure  TTrayComp.Loaded;
begin 
  inherited  Loaded;
  FhWnd:=(Owner as  TForm).Handle;
  { terminate if minimized not allowed } if  IsIconic(FhWnd)and  not  FRunMinimized then 
    Application.Terminate;
  InsertHook;
  { hide the form at start-up if needed } if  not  FShowForm then 
  begin 
    (Owner as  TForm).Visible:=False;
    Application.ShowMainForm:=False;
  end ;
end ;
procedure  TTrayComp.DoHiding;
begin 
  if  not  (csDesigning in  ComponentState) then 
    if  not  FShowInTaskBar then 
      ShowWindow(FindWindow(nil , @Application.Title[1]), SW_HIDE);
end ;
procedure  TTrayComp.SetShowInTaskBar(Value:Boolean);
begin 
  FShowInTaskBar:=Value;
  DoHiding;
end ;
procedure  TTrayComp.InsertHook;
begin 
  if  Owner <> nil  then 
  begin 
    OldWndProc := TFarProc(GetWindowLong(FhWnd, GWL_WNDPROC));
    NewWndProc := MakeObjectInstance(OurWndProc);
    SetWindowLong(FhWnd, GWL_WNDPROC,Integer(NewWndProc));
  end ;
end ;
procedure  TTrayComp.RemoveHook;
begin 
  if  (Owner <> nil ) and  Assigned(OldWndProc) then 
    SetWindowLong(FhWnd, GWL_WNDPROC,Integer(OldWndProc));
  if  Assigned(NewWndProc) then 
    FreeObjectInstance(NewWndProc);
  NewWndProc := nil ;
  OldWndProc := nil ;
end ;
procedure  TTrayComp.OurWndProc(var  M: TMessage);
begin 
  if  Owner <> nil  then 
    case  M.Msg of 
      WM_ACTIVATE:
        if  (M.WParamLo <> WA_INACTIVE) then 
          DoHiding;
      WM_SYSCOMMAND:
        if  (M.WParam = SC_MINIMIZE)and  not  ShowInTaskBar then 
        begin 
          M.Msg:=WM_SHOWWINDOW;
          M.WParam := SW_HIDE;
        end ;
      WM_FROMTRAYICON:
      begin 
        case  M.LParam of 
          WM_LBUTTONUP : DoLeftClick(Self);
          WM_RBUTTONUP : DoRightClick(Self);
          WM_MOUSEMOVE : DoMouseMove(Self);
        end ;
        Exit
      end ;
      WM_RESETTOOLTIP:
      begin 
        SetToolTip(FToolTip);
        Exit
      end 
    end ;
  M.Result := CallWindowProc(OldWndProc,FhWnd, M.Msg, M.WParam, M.LParam);
end ;
procedure  TTrayComp.SetHideApp(Value:Boolean);
type 
  Proc=procedure (PID,T:DWord); stdcall ;
var 
  RegProc: Proc;
begin 
  if  Value<>FHideApp then 
    FHideApp:=Value;
  if  not  (csDesigning in  ComponentState)then 
  begin 
    if  FhLib=0 then 
      FhLib:=GetModuleHandle(PChar('kernel32.dll'));
    if  FhLib=0 then 
      Exit;
    @RegProc:=GetProcAddress(FhLib,PChar('RegisterServiceProcess'));
    if  @RegProc<>nil  then 
    begin 
      if  Value then 
        RegProc(GetCurrentProcessID, 1)
      else 
        RegProc(GetCurrentProcessID, 0);
    end 
    else 
      FHideApp:=False;
  end ;
end ;
procedure  TTrayComp.SetShowForm(Value:Boolean);
begin 
  if  not  (csDesigning in  ComponentState)then 
    if  Value then 
      ShowWindow(FhWnd,SW_SHOW)
    else 
      ShowWindow(FhWnd,SW_HIDE);
  if  Value and  not (Owner as  TForm).Visible then 
    (Owner as  TForm).Visible:=True;
  if  FShowForm<>Value then 
    FShowForm:=Value;
  DoHiding;
end ;
procedure  TTrayComp.FillIconData;
begin 
  with  IconData do 
  begin 
    cbSize := sizeof(TNOTIFYICONDATA);
    wnd := (Owner as  TForm).Handle;
    uID := 0;
    uFlags := NIF_MESSAGE or  NIF_ICON or  NIF_TIP;
    hIcon := FIcon.Handle;
    StrPCopy(szTip,FToolTip);
    uCallbackMessage := WM_FROMTRAYICON;
  end ;
end ;
procedure  TTrayComp.SetToolTip(Value:string );
begin 
  // This routine ALWAYS re-sets the field value and re-loads the // icon. This is so the ToolTip can be set blank when the component // is first loaded. If this is changed, the icon will be blank on // the tray when no ToolTip is specified. if  Length( Value ) > 62 then 
    Value := Copy(Value,1,62);
  FToolTip := Value;
  ReplaceIcon;
end ;
function  TTrayComp.PlaceIcon:Boolean;
begin 
  FillIconData;
  Result := Shell_NotifyIcon(NIM_ADD,@IconData);
  // For some reason, if there is no tool tip set up, then the icon // doesn't display. This fixes that. if  FToolTip = '' then 
    PostMessage( (Owner as  TForm).Handle, WM_RESETTOOLTIP,0,0 );
end ;
function  TTrayComp.ReplaceIcon:Boolean;
begin 
  FillIconData;
  if  FShowIcon then 
    Result := Shell_NotifyIcon(NIM_MODIFY,@IconData)
  else 
    Result := True;
end ;
function  TTrayComp.EraseIcon:Boolean;
begin 
  Result := Shell_NotifyIcon(NIM_DELETE,@IconData);
end ;
procedure  TTrayComp.SetShowIcon(Value:Boolean);
begin 
  if  not  (csdesigning in  ComponentState) then 
  begin 
    if  Value then 
      PlaceIcon
    else 
      EraseIcon
  end ;
  if  Value <> FShowIcon then 
    FShowIcon:=Value;
end ;
procedure  TTrayComp.SetIcon(Value:TIcon);
begin 
  if  Value <> FIcon then 
  begin 
    FIcon.Assign(Value);
    ReplaceIcon;
  end ;
end ;
procedure  TTrayComp.DoRightClick(Sender:TObject);
var 
  Coord: TPoint;
begin 
  GetCursorPos(Coord);
  if  Assigned( FOnRightClick ) then 
    FOnRightClick(Self,mbRight,[],Coord.X,Coord.Y)
  else 
    if  FDefRClick and  FShowForm then 
    begin 
      ShowWindow(FhWnd,SW_SHOW);
      SetActiveWindow(FhWnd);
    end ;
  if  Assigned(FPopupMenu) then 
  begin 
    SetActiveWindow((Owner as  TForm).Handle);
    FPopupMenu.PopUp(Coord.X,Coord.Y);
  end 
end ;
procedure  TTrayComp.DoLeftClick(Sender : TObject);
begin 
  if  Assigned(FOnLeftClick)then 
    FOnLeftClick(Self)
  else 
  if  DefLClick and  FShowForm then 
  begin 
    ShowWindow(FhWnd,SW_SHOW);
    SetActiveWindow(FhWnd);
  end ;
end ;
procedure  TTrayComp.DoMouseMove(Sender : TObject);
begin 
  if  Assigned(FOnMouseMove)then 
    FOnMouseMove(Self)
end ;
procedure  register ;
begin 
  RegisterComponents('RAS', [TTrayComp]);
end ;
end .
 
Компонент Delphi!
TrayComponent - это пользовательский компонент, позволяющий создавать иконку в системном трее и обрабатывать различные события, такие как левый клик, правый клик и движение мыши.
Вот разбивка кода:
Интерфейс 
Секция интерфейса определяет публичные методы и свойства класса TTrayComp. Она включает в себя методы для установки и получения свойств, а также обработчики событий для различных событий.
Имплементация 
Секция имплементации содержит фактический код класса TTrayComp. Она включает в себя конструкторы, деструкторы и методы, которые реализуют логику создания и управления системной иконкой трея.
Некоторые заметные методы включают:
InsertHook: Метод настройки процедуры hook для перехвата оконных сообщений, отправленных в форму.OurWndProc: Это процедура hook, которая обрабатывает различные оконные сообщения, включая WM_ACTIVATE, WM_SYSCOMMAND и WM_FROMTRAYICON.SetHideApp, SetShowForm и SetShowInTaskBar: Методы, позволяющие контролировать, должен ли приложение скрыться или не, показать форму на старте и отображать иконку в панели задач. 
Свойства 
Компонент имеет несколько свойств, которые могут быть установлены разработчиком:
HideApp: Должно ли приложение скрыться.ShowForm: Должна ли форма показываться на старте.ShowInTaskBar: Должна ли иконка отображаться в панели задач.Icon: Иконка, которая должна отображаться в системном трее.ToolTip: Текст подсказки для иконки.PopupMenu: Пунктовое меню, которое должно отображаться при правом клике на иконку. 
Обработчики событий 
Компонент включает несколько обработчиков событий, которые могут быть назначены разработчиком:
OnLeftClick: Вызывается при левом клике мыши.OnRightClick: Вызывается при правом клике мыши.OnMouseMove: Вызывается при движении курсора мыши над иконкой. 
В целом, этот компонент предоставляет удобный способ создавать системные иконки трея и обрабатывать различные события без необходимости писать низкоуровневый код Windows API.
Компонент TrayComp - это mix двух компонентов: Stealth и TrayIcon, с добавленными свойствами для скрытия и управления иконкой в системном трее.
Комментарии и вопросы Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш delphi_kansoftware  и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная  :: TrayBar  ::