Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Вниз

Tray   Найти похожие ветки 

 
Zhker   (2003-01-26 20:05) [0]

Я написал все функции с треем, все работает, убирается, появляется, сделал все команды, но вот проблема - я никак не могу сделать так, чтобы приложение убиралось при нажатии на конпку минимизации на окне - Form.OnHide не работает - как мне сделать, подскажите плиз


 
Kane   (2003-01-26 20:20) [1]

Tform1.Deactivate
Application.OnDeactivate


 
Yrtimd   (2003-01-26 20:37) [2]

Application.Minimize; {свернуть}
Application.MainForm.Hide; {скрыть}


 
Романов Р.В.   (2003-01-26 21:18) [3]

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_SHOW);
Application.MainForm.Show;
Timer1.Enabled := False;
end;

function TForm1.Hook(var Message : TMessage) : Boolean;
begin
if (Message.Msg = WM_SYSCOMMAND) and (Message.WParam and $FFF0 = SC_MINIMIZE) then
begin
Application.MainForm.Hide;
ShowWindow(Application.Handle, SW_HIDE);
Timer1.Enabled := True;
Result := True;
end
else
Result := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(Hook);
Timer1.Enabled := False;
Timer1.Interval := 5000;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.UnHookMainWindow(Hook);
end;


 
Zhker   (2003-01-26 21:30) [4]

Не помогло... поточнее нельзя написать, что куда вставлять ?


 
Романов Р.В.   (2003-01-26 21:39) [5]

Все что связано с таймером нужно выкинуть.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
public
function Hook(var Message : TMessage): Boolean;
end;

var
Form1: TForm1;

implementation


 
Zhker   (2003-01-26 22:04) [6]

Спасибо, все работает!


 
Zhker   (2003-01-26 22:42) [7]

Опять проблема, я все сделал (убирается при нажатии на минимизацию и т.д.) - но всплыла новая проблема - теперь при выключении программы появляется ее значок в трее, но если над ним поводить мышкой - он исчезнет - я уж и так и сяк пробовал - иконка все время упорно лезет в трей полсе закрытия проги. Как лечить ?


 
Романов Р.В.   (2003-01-26 22:45) [8]

А ты ее в OnClose убиваешь?


 
Zhker   (2003-01-27 00:18) [9]

Да, канешк, гляди :
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIcon (NIM_DELETE, @nid);
end;


 
Юрий Зотов   (2003-01-27 06:36) [10]

> Как лечить?
Заставить окно трея перерисоваться.
FindWindow + InvalidateRect + UpdateWindow


 
Zhker   (2003-01-27 15:59) [11]

Юрий, а как это написать ? Я InvalidateRect не знаю


 
Cobalt   (2003-01-27 22:49) [12]

Ну, Юра, у вас и щутки...
$)


 
Юрий Зотов   (2003-01-28 00:11) [13]

Ну, это не совсем шутка. Найти окно трея можно так:

Wnd := FindWindowEx(FindWindowEx(FindWindow("Shell_TrayWnd",
nil), 0, "TrayNotifyWnd", nil), 0, "ToolbarWindow32", nil);

А заставить его перерисоваться можно так же, как и любое другое окно:
InvalidateRect(Wnd, nil, True);
UpdateWindow(Wnd)

Другое дело, что пока не было вызвано
Shell_NotifyIcon (NIM_DELETE, ...)
эта перерисовка ничего не даст. А после того, как этот вызов был сделан, не нужна и перерисовка - трей сам перерисуется.

Короче говоря, вот полный код Tray Application. На форму надо бросить PopupMenu, а в нем создать 2 пункта - "Show" и "Exit".

type
TTrayForm = class(TForm)
TrayPopupMenu: TPopupMenu;
MenuItemShow: TMenuItem;
MenuItemExit: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure MenuItemShowClick(Sender: TObject);
procedure MenuItemExitClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FIconData: TNotifyIconData;
procedure WMUser(var Message: TMessage); message WM_USER;
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
end;

var
TrayForm: TTrayForm;

implementation

{$R *.DFM}

procedure TTrayForm.FormCreate(Sender: TObject);
begin
with Application, FIconData do
begin
ShowMainForm := False;
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
cbSize := SizeOf(FIconData);
Wnd := Self.Handle;
uID := 100;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := WM_USER;
hIcon := Icon.Handle;
StrPCopy(szTip, Title)
end;
Shell_NotifyIcon(NIM_ADD, @FIconData)
end;

procedure TTrayForm.MenuItemShowClick(Sender: TObject);
begin
Show;
MenuItemShow.Enabled := False
end;

procedure TTrayForm.MenuItemExitClick(Sender: TObject);
begin
Close
end;

procedure TTrayForm.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType and $FFF0 = SC_MINIMIZE then
begin
Hide;
MenuItemShow.Enabled := True
end
else inherited
end;

procedure TTrayForm.WMUser(var Message: TMessage);
var
P: TPoint;
begin
if Message.LParam = WM_RBUTTONDOWN then
begin
GetCursorPos(P);
SetForegroundWindow(Handle);
TrayPopupMenu.Popup(P.X, P.Y);
PostMessage(Handle, WM_NULL, 0, 0)
end
end;

procedure TTrayForm.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @FIconData)
end;





 
Zhker   (2003-01-29 23:47) [14]

Юрий, у меня все получилось, все работает, ничего не остается, но вот такая проблема - при создании у меня есть окно, в трее ничего нет, на панели задач - окошко программы, я сворачиваю программу, пояляется иконка в трее, убирается программа с панели задач. Вызываю попап меню и нажимаю "Показать окно" - убирается иконка в трее, но окошко программы на панели задач не появляется, и хоть убей у меня ничего не получается, я делал что-то типа :
procedure TForm1.Show1Click(Sender: TObject);
begin
ShowWindow (Handle, sw_ShowNormal);
Show;
Shell_NotifyIcon(NIM_DELETE, @FIconData);
Show1.Enabled := False
end;

Что делать ?


 
Юрий Зотов   (2003-01-30 09:13) [15]

1. Уберите строки:

ShowMainForm := False;
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);


2. Видимостью формы и окна на панели задач управляйте вручную:

Show;
ShowWindow(Application.Handle, SW_SHOW);

Hide;
ShowWindow(Application.Handle, SW_HIDE);


 
Романов Р.В.   (2003-01-30 09:44) [16]

Да и еще, при сворачивании формы через меню кнопки на TaskBar, приложение не будет прятаться в Tray.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.01 c
1-28859
Dr.Karter
2003-01-21 10:29
2003.02.10
DrawGrid - одни мучения и часы проведенные в пустую


4-29155
mate
2002-12-26 17:14
2003.02.10
Post и SendMessage


14-29029
Chubais
2003-01-23 18:31
2003.02.10
Поиск ошибок


1-28817
Шишкин Илья
2003-01-31 20:44
2003.02.10
Как изменить цвет значков в Windows98


1-28838
ИгорьК
2003-01-29 17:41
2003.02.10
FormCreate в классе-предке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский