![]() |
|
|
#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
|
||||
|
||||
![]() Конкретно, где ошибка.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
![]() в общем прога не хочет минимизироватся, не хочет показатся после клика иконки в трее , воопще (((( и окно видится в таскбаре.
|
#4
|
||||
|
||||
![]() Есть готовые компоненты TrayIcon.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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. Причина: Убрал мат |