Компонент 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 }
FhWnd : hWnd;
FhLib : hInst;
{ for hiding }
FHideApp : Boolean;
FShowForm : Boolean;
FShowInTaskBar: Boolean;
FRunMinimized : Boolean;
OldWndProc : TFarProc;
NewWndProc : Pointer;
{ for icon }
IconData : TNOTIFYICONDATA;
FIcon : TIcon;
FToolTip : 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 }
FHideApp:=True;
FShowForm:=True;
FShowInTaskBar := False;
FRunMinimized:=False;
NewWndProc := 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 }
FIcon := TIcon.Create;
FShowIcon:=True;
FDefRClick:=False;
FDefLClick:=True;
if (csDesigning in ComponentState) then
SetIcon(Application.Icon);
end ;
destructor TTrayComp.Destroy;
begin
{ for hiding }
RemoveHook;
{ 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 прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: TrayBar ::