Текущий архив: 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.48 MB
Время: 0.013 c