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

Вниз

Помоготе по 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
1-43552
Александр1
2004-02-26 14:20
2004.03.14
Работа с WordApplication и WordDocument


7-43930
CC
2003-12-24 15:21
2004.03.14
сканирование рисунка


1-43491
Mox Fulder
2004-02-28 20:05
2004.03.14
CreatePolyPolygonRgn


14-43770
Думкин
2004-02-19 06:13
2004.03.14
С днем рождения! 19 февраля.


3-43288
tv
2004-02-12 12:24
2004.03.14
Unicode строки в поле типа Memo





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский