![]() |
|
|
|
|
#1
|
|||
|
|||
|
Здрасте ребята , у меня вопрос о запуске програме в трее , писал тоже на асемблер давно , работает , пишу сейчас на делфи 6 , не хочет , есть проблеми. Помогите , покажите ошибки если не лень.
Вот мои пример с пустой форме : Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ShellApi, Menus,AppEvnts;
const
WM_ICONTRAY = WM_USER + 1;
NIF_INFO = 16;
NIF_SHOWTIP = $80;
WM_SHELLNOTIFY = WM_USER+5;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
est11: TMenuItem;
est21: TMenuItem;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure est11Click(Sender: TObject);
procedure est21Click(Sender: TObject);
private
TrayIconData: TNotifyIconData;
public
procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
procedure MySize(var Msg: TMessage); message WM_SIZE;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
with TrayIconData do
begin
cbSize := SizeOf(TrayIconData);
Wnd := Handle;
uID := 0;
uFlags := NIF_MESSAGE+NIF_ICON+NIF_TIP+NIF_INFO+NIF_SHOWTIP;
uCallbackMessage := WM_ICONTRAY; //WM_ICONTRAY
hIcon := Application.Icon.Handle;
StrPCopy(szTip, Application.Title);
//uVersion:=NOTIFYICON_VERSION_4;
end;
Shell_NotifyIcon(NIM_ADD, @TrayIconData);
//ShowWindow(Handle,SW_HIDE);
//windows.PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
end;
procedure TForm1.TrayMessage(var Msg: TMessage);
var p : TPoint;
begin
case Msg.lParam of
WM_LBUTTONDOWN: ShowWindow(Handle,SW_RESTORE);
WM_LBUTTONDBLCLK: ShowWindow(Handle,SW_RESTORE);
WM_RBUTTONDOWN:
begin
SetForegroundWindow(Handle);
GetCursorPos(p);
PopUpMenu1.Popup(p.x, p.y);
PostMessage(Handle, WM_NULL, 0, 0);
end;
end;
end;
procedure TForm1.MySize(var Msg: TMessage);
begin
IF Msg.lParam=SIZE_MINIMIZED Then
begin
windows.PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
//Form1.Hide;
end;
end;
procedure TForm1.est11Click(Sender: TObject);
begin
//Form1.Show;
//ShowWindow(Handle,SW_RESTORE);
windows.PostMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
end;
procedure TForm1.est21Click(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
exitprocess(0);
end;
end.
|
|
#2
|
||||
|
||||
|
Конкретно, где ошибка.
|
|
#3
|
|||
|
|||
|
в общем прога не хочет минимизироватся, не хочет показатся после клика иконки в трее , воопще (((( и окно видится в таскбаре.
|
|
#4
|
||||
|
||||
|
Есть готовые компоненты TrayIcon.
|
|
#5
|
|||
|
|||
|
есть да , но когда установлю етот компоненет делфи покинул все осталъе компонентъи установлени от меня , примерно скаип компонент.
Я хочу простои пример на икон в трее если можно. |
|
#6
|
||||
|
||||
|
Проблема не в иконке. Работать надо не с хендлом формы, а с хендлом аппликухи, и обрабатывать сбытия аппликухи. Стандартная ошибка начинающих.
|
|
#7
|
|||
|
|||
|
с хендлом форме работает а с хендлом апликации не хочет.
|
|
#8
|
||||
|
||||
|
Цитата:
Код:
... TrayIcon:= TTrayIcon.Create(TrayIcon); with TrayIcon do begin ToolTip:= 'Моя прога'; Icon:= Application.Icon; Active:= True; PopupMenu:= MyPopupMenu; OnDblClick:= TrayIconOnDblClick; ... end; ... Код:
TrayIcon.Destroy; |
|
#9
|
||||
|
||||
|
Можно сделать намного легче. Прикрепил юнит, пользуйтесь на здоровье.
Код:
uses Tray;
...
var
TaskBarCreated : Boolean;
const
WM_TRAY = WM_USER + 1;
...
function WindowProc(Wnd: HWND; Msg, wParam, lParam: Integer): Integer; stdcall;
begin
Result := 0;
case Msg of
WM_SYSCOMMAND:
begin
case LoWord(wParam) of
// При сворачивании программы
SC_MINIMIZE:
begin
TaskBarCreated := TaskBarAddIcon(Wnd, ID_ICON, WC.hIcon, WM_TRAY, 'Hello!');
ShowWindow(Wnd, SW_MINIMIZE);
ShowWindow(Wnd, SW_HIDE);
end;
// При восстановлении окна
SC_RESTORE:
begin
if TaskBarCreated then
begin
TaskBarDeleteIcon(Wnd, ID_ICON);
TaskBarCreated := False;
ShowWindow(Wnd, SW_SHOWNORMAL)
end
end;
end
end;
WM_TRAY:
begin
case LoWord(lParam) of
WM_LBUTTONDBLCLK:
begin
SetForegroundWindow(Wnd);
SendMessage(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
end;
end
end;
WM_DESTROY:
begin
if TaskBarCreated then
TaskBarDeleteIcon(Wnd, ID_ICON);
PostQuitMessage(0);
Exit
end
end;
Result := DefWindowProc(Wnd, Msg, wParam, lParam)
end;Последний раз редактировалось M.A.D.M.A.N., 18.03.2013 в 15:46. Причина: Убрал мат |