Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.14;
Скачать: CL | DM;

Вниз

Помоготе по SysTray ю...   Найти похожие ветки 

 
Saimon   (2004-01-07 02:47) [0]

Уважаемые мастера, помогите по SysTray"ю, ПЛИЗЗЗ.
Для вывода контекстного меню и обработки двойного щелчка по иконке я использую след. функцию:

private
procedure NotifyIcon(var Msg : TMessage); message WM_USER + 100;
...

var
FIconData: TNotifyIconData;
...

procedure TForm1.NotifyIcon(var Msg : TMessage);
var P: TPoint;
begin
case Msg.LParam of
WM_LBUTTONDBLCLK :
begin
ShowWindow(Application.Handle,SW_SHOW);
Application.Restore;
Shell_NotifyIcon(NIM_DELETE,@FIconData);
WindowState:=wsNormal;
end;
WM_RBUTTONDOWN :
begin
GetCursorPos(P);
PopupMenu1.Popup(P.X, P.Y);
end;
end;
end;
...


но ничего не происходит, т.е. ни двойной щелчок левой кнопкой, ни одинарный - правой не обрабатываются. Что я делаю не так, исправьте, плиззз, ошибку.

Заранее благодарен, Saimon.


 
Serega___________   (2004-01-07 06:39) [1]

В программах для Window 95 и выше часто используется TrayIcon – иконка справа на TaskBar, которая позволяет программе почти не занимать места на экране и при этом быть всегда доступной. Для работы с TrayIcon используется функция Shell_NotifyIcon, в которую передается команда: NIM_ADD, NIM_MODIFY или NIM_DELETE для создания изменения и удаления соответственно, и структура TNotifyIconData. У каждой TrayIcon в вашем приложении должен быть свой uID.

СДЕЛАЙ ВСЕ КАК ЗДЕСЬ НАПИСАНО И ВСЕ БУДЕТ РАБОТАТЬ...

const
WM_NOTIFYTRAYICON = WM_USER + 1;
...
private
procedure WMTRAYICONNOTIFY(var Msg: TMessage);
message WM_NOTIFYTRAYICON;
...
uses ShellAPI;

procedure TForm1.WMTRAYICONNOTIFY(var Msg: TMessage);
var
s: String;
begin
case Msg.LParam of
WM_MOUSEMOVE: s := "Мышь сдвинута";
WM_LBUTTONDOWN: s := "Левая кнопка нажата";
WM_LBUTTONUP: s := "Левая кнопка отпущена";
WM_LBUTTONDBLCLK: s := "Два раза нажата левая кнопка";
WM_RBUTTONDOWN: s := "Правая кнопка нажата";
WM_RBUTTONUP: s := "Правая кнопка отпущена";
WM_RBUTTONDBLCLK: s := "Два раза нажата правая кнопка";
else s := IntToStr(Msg.LParam);
end;
ListBox1.Items.Add(s);
ListBox1.ItemIndex := ListBox1.Items.Count - 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
tray: TNotifyIconData;
Ic: TIcon;
begin
Ic := TIcon.Create;
Ic.LoadFromFile("Icon1.ico");
with tray do begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := Ic.Handle;
szTip := ("Это наша иконка");
end;
Shell_NotifyIcon(NIM_ADD, Addr(tray));
Ic.Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
tray: TNotifyIconData;
Ic: TIcon;
begin
Ic := TIcon.Create;
Ic.LoadFromFile("Icon2.ico");
with tray do begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := Ic.Handle;
szTip := ("Это другая иконка");
end;
Shell_NotifyIcon(NIM_MODIFY, Addr(tray));
Ic.Destroy;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
tray: TNotifyIconData;
begin
with tray do begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
end;
Shell_NotifyIcon(NIM_DELETE, Addr(tray));
end;



 
Serega___________   (2004-01-07 07:00) [2]

еще кое что...

когда вызываешь менюшку:

GetCursorPos(P);
SetForegroundWindow(Application.Handle);
Application.ProcessMessages;
PopupMenu1.Popup(P.X, P.Y);


 
Saimon   (2004-01-07 13:55) [3]

Serega___________, спосибо тебе...


 
Saimon   (2004-01-07 14:33) [4]

Serega___________, у тебя есть ОШИБОЧКА в строчке "cbSize := SizeOf(TNotifyIconData);"...

Я вчера как раз во всем разобрался и выкладываю тебе весь исходничек с коментариями, компильнется на все 100%. (может пригодится)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, ShellAPI;
//Забудешь про "ShellAPI", не откомпилируется.

type
TForm1 = class(TForm)
pm: TPopupMenu; // PopupMenu1
miClose: TMenuItem; // ItemMenu for PopupMenu1
miMinimize: TMenuItem; // ItemMenu for PopupMenu1
miNormal: TMenuItem; // ItemMenu for PopupMenu1
N1: TMenuItem; // ItemMenu for PopupMenu1
pm1: TPopupMenu; // PopupMenu2
imMin: TMenuItem; // ItemMenu for PopupMenu2
imMax: TMenuItem; // ItemMenu for PopupMenu2
imNorm: TMenuItem; // ItemMenu for PopupMenu2
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
procedure miCloseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure miMinimizeClick(Sender: TObject);
procedure miNormalClick(Sender: TObject);
private
FIconData: TNotifyIconData;
FClosing: Boolean;
protected
procedure WMMIDASIcon(var Message: TMessage); message WM_USER + 1;
procedure AddIcon;
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMIDASIcon(var Message: TMessage);
var
pt: TPoint;
begin
case Message.LParam of
WM_RBUTTONUP:
begin
SetForegroundWindow(Handle);
GetCursorPos(pt);
pm.Popup(pt.x, pt.y);
SetForegroundWindow(Handle);
end;
WM_LBUTTONDBLCLK:
miNormalClick(nil);
WM_RBUTTONDBLCLK:
miMinimizeClick(nil);
WM_LButtonUp:
begin
SetForegroundWindow(Handle);
GetCursorPos(pt);
pm1.Popup(pt.x, pt.y);
SetForegroundWindow(Handle);
end;
end;
end;

procedure TForm1.AddIcon;
// [1] var iIcon: TIcon;
begin
// [1] iIcon := TIcon.Create;
// [1] iIcon.LoadFromFile("Icon2.ico");

with FIconData do
begin
cbSize := SizeOf(FIconData);
Wnd := Self.Handle; //Если Application.Handle, то иконка не реагирует на мышь
uID := $DEDB;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
// hIcon := Form1.Icon.Handle; //Иконка из заголовка окна
// [1] hIcon := iIcon.Handle; // Своя иконка из файла

hIcon := Application.Icon.Handle; //Иконка программы
uCallbackMessage := WM_USER + 1;
StrCopy(szTip, PChar(Caption)); //Hint (Form1.Caption)
Shell_NotifyIcon(NIM_Add, @FIconData);
end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if FClosing then
CanClose := True
else begin
CanClose := False;
Application.Minimize;
ShowWindow(Application.Handle,SW_HIDE);
end;
end;

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

procedure TForm1.miCloseClick(Sender: TObject);
begin
FClosing := True;
Close
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FClosing:= False;
AddIcon;
end;

procedure TForm1.miMinimizeClick(Sender: TObject);
begin
Application.Minimize;
ShowWindow(Application.Handle,SW_HIDE);
end;

procedure TForm1.miNormalClick(Sender: TObject);
begin
ShowWindow(Application.Handle,SW_SHOW);
OpenIcon(Application.Handle);
end;

end.

Но все равно тебе спосибо за помощь (хоть уже и не нужную).

[ SAIMON ]

P.S.: Если че, пиши на мыло...


 
Saimon   (2004-01-07 14:34) [5]

Забыл сказать свое мыло...

saimonz@mail.ru


 
AlexVas   (2004-01-07 17:29) [6]

Спасибо боьшое за пример. Работает.


 
Saimon   (2004-01-07 19:55) [7]


> Спасибо боьшое за пример. Работает.


AlexVas, а ты че хотел???
Я ведь его тестировал сам в Win9x, а в других ВИНДАХ не пробрвал, но буду очень признателен если кто проверит, и сообщит мне на saimonz@mail.ru . Почему тестировал?? нужен он мне самогу был по зарез, вот и все...


 
AbrosimovA ©   (2004-01-08 10:10) [8]


> но ничего не происходит, т.е. ни двойной щелчок левой кнопкой,
> ни одинарный - правой не обрабатываются. Что я делаю не
> так, исправьте, плиззз, ошибку.


А не будет работать без:

with TrayIcon do begin
cbSize := SizeOf(TrayIcon);
Wnd := Form1.Handle;
uID := 100;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage := WM_USER + 100;
hIcon := Application.Icon.Handle;
szTip := "Моя программа";
end;



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

Текущий архив: 2004.03.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
14-43787
Undert
2004-02-18 17:15
2004.03.14
Подскажите пожалуйста


1-43485
TButton
2004-02-28 20:09
2004.03.14
Application.Active


3-43350
GogaStar
2004-02-16 13:52
2004.03.14
Как побороть


1-43545
my4ga
2004-02-27 15:30
2004.03.14
звук


3-43404
Vist
2004-02-13 12:02
2004.03.14
Индексация через BDE